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

如何在XSLT的for-each循环中引用模板匹配的当前节点?

在XSLT的for-each循环中引用模板匹配的原始当前节点

好问题!咱们先搞懂你示例里的现象,再解决核心需求——怎么在for-each里拿到模板最初匹配的那个节点。

为什么你的示例里两个count结果相同?

在你的代码里,<xsl:for-each select="preceding::product">会迭代所有当前模板匹配节点的前置product节点。在这个循环内部:

  • . 代表当前迭代到的product节点(也就是循环的上下文节点)
  • current() 在for-each内部,和.的作用完全一致,同样指向当前迭代的节点

所以你调用count(current()/preceding::product)和count(./preceding::product),本质上都是统计当前迭代节点的前置product数量,结果自然相同。

怎么引用模板匹配的原始节点?

如果想在for-each里引用模板一开始匹配的那个<product[@category='foo']>节点,你需要在进入循环前,把这个节点存到一个变量里,之后在循环内通过变量引用它。

修改后的代码示例:

<xsl:template match="product[@category='foo']">
  <!-- 先把模板匹配的原始节点存到变量里 -->
  <xsl:variable name="templateRoot" select="."/>
  <count>
    <xsl:for-each select="preceding::product">
      <current-iteration-node-count>
        <!-- 统计当前迭代节点的前置product数量 -->
        <xsl:value-of select="count(./preceding::product)"/>
      </current-iteration-node-count>
      <template-matched-node-count>
        <!-- 统计模板原始节点的前置product数量 -->
        <xsl:value-of select="count($templateRoot/preceding::product)"/>
      </template-matched-node-count>
    </xsl:for-each>
  </count>
</xsl:template>

这样一来,$templateRoot就始终指向模板最初匹配的那个product节点,和for-each循环的迭代上下文完全分开,你就能在循环里自由引用它了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:38:53