XSL/XSLT 1.0嵌套for循环内如何获取匹配节点的取值
核心原因
你遇到的问题本质是XSLT的上下文节点切换规则:
- 进入
<xsl:for-each select="$weights-in-kg">后,当前上下文节点就变成了遍历到的weight元素,所以此时.返回的是重量值 - 原模板匹配到的
fruit节点已经不在当前上下文中了
解决方案
通过参数传递外层节点即可,不需要硬编码路径,用到XSLT 1.0自带的current()函数,该函数会返回当前模板最初匹配到的节点,不会被内层的for-each上下文切换影响。
步骤1:调用模板时传入外层节点参数
修改匹配fruit的模板代码:
<xsl:template match="shop/fruits/fruit"> <xsl:for-each select="$weights-in-kg"> <xsl:call-template name="some-template-I-have"> <!-- current() 指向当前模板匹配的原始fruit节点 --> <xsl:with-param name="outer-node" select="current()" /> </xsl:call-template> </xsl:for-each> </xsl:template>
步骤2:命名模板中声明接收参数
修改some-template-I-have模板代码:
<xsl:template name="some-template-I-have"> <!-- 声明接收外层节点参数 --> <xsl:param name="outer-node" /> <!-- 获取当前weight值,依旧用. --> 重量:<xsl:value-of select="." /> <!-- 获取外层fruit值,用传入的参数 --> 水果:<xsl:value-of select="$outer-node" /> </xsl:template>
补充说明
这个方案完全满足模板复用需求:如果在其他场景调用该模板,只需要把对应需要的外层节点作为outer-node参数传入即可,不需要修改模板内部逻辑。
内容的提问来源于stack exchange,提问作者DonBaka
相关产品推荐
相关产品推荐

