如何使用XSLT转换XML,输出带@value属性节点的指定格式完整路径
实现代码
下面是可直接运行的XSLT 1.0样式表,兼容绝大多数XSLT处理器:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" indent="no"/> <!-- 匹配根节点,遍历所有带@value属性的元素 --> <xsl:template match="/"> <xsl:for-each select="//*[@value]"> <!-- 递归生成祖先路径 --> <xsl:apply-templates select="." mode="build-path"/> <!-- 末尾补上@value,换行 --> <xsl:text>/@value </xsl:text> </xsl:for-each> </xsl:template> <!-- 递归构建路径的模板 --> <xsl:template match="*" mode="build-path"> <!-- 先处理父节点,除根节点外都先输出父级路径加斜杠 --> <xsl:if test="parent::* and not(parent::/)"> <xsl:apply-templates select="parent::*" mode="build-path"/> <xsl:text>/</xsl:text> </xsl:if> <!-- 处理当前节点:Item带key属性则输出带筛选的格式,否则直接输出节点名 --> <xsl:choose> <xsl:when test="local-name() = 'Item' and @key"> <xsl:text>Item [@key='</xsl:text> <xsl:value-of select="@key"/> <xsl:text>']</xsl:text> </xsl:when> <xsl:otherwise> <xsl:value-of select="local-name()"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
输出说明
你给出的预期输出中第三个路径的с2是笔误,原XML对应节点为c3,实际运行后的正确输出为:
a/Item [@key='1']/c1/d12/@value a/b2/Item [@key='fix']/d22/@value a/b3/c3/Item [@key='price']/e2/@value
核心逻辑
- 首先遍历XML中所有带有
value属性的元素,逐个生成对应路径 - 递归向上遍历每个元素的祖先节点,逐层拼接路径片段
- 遇到带有
key属性的Item节点时,按要求补充[@key='xxx']的属性筛选标记,其余节点直接使用节点名拼接 - 最后为每个路径拼接末尾的
/@value得到最终结果
内容的提问来源于stack exchange,提问作者eliasum
相关产品推荐
相关产品推荐

