理解XSLT中的position()函数

use*_*892 7 xml xslt

我和这个家伙有类似的问题:

在xslt中使用position()函数

但我不需要编号,我只是想了解它的工作方式:

<?xml version="1.0" encoding="UTF-8"?>
<test>
<a>blah</a>
<a>blah</a>
<a>blah</a>
<a>blah</a>
</test>
Run Code Online (Sandbox Code Playgroud)

对于此输入,以下样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
<xsl:apply-templates/>
  </body>
  </html>
</xsl:template>

<xsl:template match="select">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="a">
<xsl:value-of select="position()"/><br/>
<xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

输出:

<html><body>
2<br>blah
4<br>blah
6<br>blah
8<br>blah
</body></html>
Run Code Online (Sandbox Code Playgroud)

为什么跳过不均匀的数字?

mic*_*57k 7

为什么它跳过奇数?

因为当你在那个/级别时,你说:

<xsl:apply-templates/>
Run Code Online (Sandbox Code Playgroud)

它将模板应用于根节点的所有子节点,并且(由于内置模板规则)应用于它们的所有后代 -包括分隔<a>元素的文本节点

输入以下内容,您将获得不同的结果:

<?xml version="1.0" encoding="UTF-8"?>
<test><a>blah</a><a>blah</a><a>blah</a><a>blah</a></test>
Run Code Online (Sandbox Code Playgroud)

或者如果您在样式表中添加一条指令:

<xsl:strip-space elements="*"/>
Run Code Online (Sandbox Code Playgroud)

或者如果您有选择地应用模板,例如

<xsl:apply-templates select="//a"/>
Run Code Online (Sandbox Code Playgroud)


Ian*_*rts 6

position()函数为您提供当前节点在"当前节点列表"中的位置,即select最近的apply-templates或者for-each(XSLT 2.0指的是"项目"和"序列"而不是节点和节点列表,但原则是相同).

在您的示例中,根模板将模板应用于其两个子节点(包含xml声明后的换行符的文本节点和test元素).没有明确的规则匹配,test因此适用默认规则,对于元素意味着<xsl:apply-templates/>.

因此,当a模板触发其"当前节点列表"时,是所有9个子节点的集合test.该列表由交替的文本节点(换行符)和元素节点(a元素)组成,文本节点位于奇数位置,元素节点位于偶数位置.

如果您添加了这样的显式模板test:

<xsl:template match="test">
  <xsl:apply-templates select="*"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

然后,这将选择4个a元素节点作为当前节点列表,因此position()将给出1,2,3和4.