该position()
函数本质上是上下文相关的 - 它为您提供当前节点在apply-templates
导致此模板触发的 所选节点集中的位置。因此,这完全取决于$var1
变量包含的内容。如果$var1
是一个包含xyz
元素的节点集,每个元素都有一个abc
子节点,那么$var1/*
将一次性选择所有abc
元素:
<xyz> <!-- $var1 -->
<abc/> <!-- $var1/* -->
</xyz>
<xyz> <!-- $var1 -->
<abc/> <!-- $var1/* -->
</xyz>
(空白文本节点和注释仅用于澄清,假设真正的 XML 树仅包含元素节点),您将获得position()
您期望的值。
但是,如果$var1
是 XPath 数据模型中的单个根节点(例如文档片段),该节点将xyz
元素作为其子节点,$var1/*
则将选择xyz
元素,而不是abc
那些元素。
<!-- $var1 (the root node) -->
<xyz> <!-- $var1/* -->
<abc/>
</xyz>
<xyz> <!-- $var1/* -->
<abc/>
</xyz>
现在,当您将模板应用于这些时,隐式默认模板将匹配它们,并且对于每个模板,它将递归调用apply-templates
该节点的子节点(单个abc
元素)。所以现在position()
会给你在abc
它的父母的孩子的集合中的位置,它总是1。
如果这是正在发生的事情,那么最简单的解决方法就是说
<xsl:apply-templates select="$var1/*/*"/>
一口气选择所有abc
元素。