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

XSLT如何遍历XML任意深度同名嵌套节点获取description值

XSLT 任意深度同名嵌套节点遍历方案

你原有代码无法取到全部值的原因很简单:逻辑只覆盖了两层节点——匹配到Field时仅提取当前节点的description,再遍历一层直接子Field的description,第三层及更深的Field节点没有被任何处理逻辑覆盖,自然拿不到对应的值。

不需要手写多层for-each适配未知嵌套深度,用XSLT原生的递归模板匹配就能解决,兼容所有XSLT版本,不管Field嵌多少层都能自动遍历:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 根节点入口,触发顶层Field处理 -->
  <xsl:template match="/Root">
    <xsl:apply-templates select="Field"/>
  </xsl:template>

  <!-- Field节点通用处理模板 -->
  <xsl:template match="Field">
    <!-- 提取当前节点的description值 -->
    <xsl:value-of select="description"/>
    <!-- 换行分隔不同值,不需要可删除 -->
    <xsl:text>&#10;</xsl:text>
    <!-- 递归触发当前节点下所有子Field的处理,自动复用本模板逻辑 -->
    <xsl:apply-templates select="Field"/>
  </xsl:template>
</xsl:stylesheet>

逻辑说明

  • 核心是用xsl:apply-templates替代原有xsl:for-each:每处理一个Field节点,提取完当前节点的description后,会自动把当前节点下所有直接子Field传入同一个Field匹配模板重复处理,递归会一直执行到最底层没有子Field的节点为止。
  • 针对给出的示例XML,上述代码会按节点嵌套顺序输出全部7个description值:
Test 1
Test 2
Test 3
Test 4
Test 5
Test 6
Test 7

如果需要区分节点层级(比如输出缩进、层级编号),可以给模板加个层级参数实现:

<xsl:template match="Field">
  <xsl:param name="depth" select="1"/>
  <!-- 按层级生成缩进,拼接description输出 -->
  <xsl:value-of select="concat(substring('          ',1,$depth*2), description, '&#10;')"/>
  <!-- 递归处理子节点时,层级数+1 -->
  <xsl:apply-templates select="Field">
    <xsl:with-param name="depth" select="$depth + 1"/>
  </xsl:apply-templates>
</xsl:template>

内容的提问来源于stack exchange,提问作者user1441279

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:33:00