You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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&#10;</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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:42:01