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> </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, ' ')"/> <!-- 递归处理子节点时,层级数+1 --> <xsl:apply-templates select="Field"> <xsl:with-param name="depth" select="$depth + 1"/> </xsl:apply-templates> </xsl:template>
内容的提问来源于stack exchange,提问作者user1441279
相关产品推荐
相关产品推荐

