如何在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
相关产品推荐
相关产品推荐

