XSLT 2.0如何提取XML冒号分隔文本生成对应结构化节点
XSLT 2.0 实现方案
不需要用通配符做匹配,XSLT 2.0 原生的字符串处理函数完全可以实现这个需求,核心思路是拆分<body>内的多行文本,逐行动态生成对应节点即可。
完整转换代码
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:原样保留无需特殊处理的节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 单独处理body节点 --> <xsl:template match="body"> <!-- 按换行拆分文本,去除每行前后空白,过滤空行 --> <xsl:variable name="validLines" select="tokenize(., '\n') ! normalize-space(.)[. != '']"/> <xsl:for-each select="$validLines"> <!-- 拆分节点名和节点值:第一个冒号前为节点名,剩余内容为值 --> <xsl:variable name="nodeName" select="substring-before(., ':')"/> <xsl:variable name="nodeValue" select="normalize-space(substring-after(., ':'))"/> <!-- 动态生成目标节点 --> <xsl:element name="{$nodeName}"> <xsl:value-of select="$nodeValue"/> </xsl:element> </xsl:for-each> </xsl:template> </xsl:stylesheet>
逻辑说明
- 身份模板会自动保留根节点
<mail>这类不需要修改的结构,只会替换<body>节点下的内容,不会破坏原有XML的外层结构 - 拆分文本时优先按换行符切割,自动过滤掉缩进、空行带来的无效内容,兼容不同操作系统的换行符差异
- 节点名和值的拆分以每行第一个冒号为分隔符,即使后续取值里包含冒号也不会出现拆分错误
- 所有取值都会自动做首尾空白去除,避免保留原文本里冒号后的空格、换行等多余字符
转换效果
传入提供的示例XML,转换后输出结果完全符合预期:
<mail> <Fruit>apple</Fruit> <Vagetable>potato</Vagetable> <Animal>dog</Animal> </mail>
内容的提问来源于stack exchange,提问作者Anonymus007
相关产品推荐
相关产品推荐

