理解 XSLT 中的 position() 函数
understanding position() function in XSLT
我和这个人有类似的问题:
using position() function in xslt
但我不需要编号,我只是想了解它的工作方式:
<?xml version="1.0" encoding="UTF-8"?>
<test>
<a>blah</a>
<a>blah</a>
<a>blah</a>
<a>blah</a>
</test>
对于此输入,以下样式表:
<?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>
输出:
<html><body>
2<br>blah
4<br>blah
6<br>blah
8<br>blah
</body></html>
为什么会跳过奇数?
Why does it skip the uneven numbers?
因为当你处于 /
级别时,你说:
<xsl:apply-templates/>
它将模板应用于根节点的所有子节点,并且(由于内置模板规则)应用于它们的所有后代 - 包括分隔 <a>
元素.
输入以下内容会得到不同的结果:
<?xml version="1.0" encoding="UTF-8"?>
<test><a>blah</a><a>blah</a><a>blah</a><a>blah</a></test>
或者如果您向样式表中添加一条说明:
<xsl:strip-space elements="*"/>
或者如果您有选择地应用模板,例如
<xsl:apply-templates select="//a"/>
position()
函数为您提供当前节点在 "current node list" 中的位置,即由最近的 apply-templates
或 [= 编辑的 select
-ed 14=](XSLT 2.0 指的是 "items" 和 "sequences" 而不是节点和节点列表,但原理是相同的)。
在您的示例中,根模板将模板应用于其两个子节点(在 xml 声明之后包含换行符的文本节点,以及 test
元素)。没有明确的规则匹配 test
所以默认规则适用,对于元素意味着 <xsl:apply-templates/>
.
因此,当 a
模板触发时,它的 "current node list" 是 test
的所有 9 个子节点的集合。该列表由交替的文本节点(换行符)和元素节点(a
元素)组成,文本节点位于奇数位置,元素节点位于偶数位置。
如果您像这样为 test
添加了显式模板:
<xsl:template match="test">
<xsl:apply-templates select="*"/>
</xsl:template>
那么这将select 只有 4个a
元素节点作为当前节点列表,所以position()
会给你1, 2、3 和 4。
我和这个人有类似的问题:
using position() function in xslt
但我不需要编号,我只是想了解它的工作方式:
<?xml version="1.0" encoding="UTF-8"?>
<test>
<a>blah</a>
<a>blah</a>
<a>blah</a>
<a>blah</a>
</test>
对于此输入,以下样式表:
<?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>
输出:
<html><body>
2<br>blah
4<br>blah
6<br>blah
8<br>blah
</body></html>
为什么会跳过奇数?
Why does it skip the uneven numbers?
因为当你处于 /
级别时,你说:
<xsl:apply-templates/>
它将模板应用于根节点的所有子节点,并且(由于内置模板规则)应用于它们的所有后代 - 包括分隔 <a>
元素.
输入以下内容会得到不同的结果:
<?xml version="1.0" encoding="UTF-8"?>
<test><a>blah</a><a>blah</a><a>blah</a><a>blah</a></test>
或者如果您向样式表中添加一条说明:
<xsl:strip-space elements="*"/>
或者如果您有选择地应用模板,例如
<xsl:apply-templates select="//a"/>
position()
函数为您提供当前节点在 "current node list" 中的位置,即由最近的 apply-templates
或 [= 编辑的 select
-ed 14=](XSLT 2.0 指的是 "items" 和 "sequences" 而不是节点和节点列表,但原理是相同的)。
在您的示例中,根模板将模板应用于其两个子节点(在 xml 声明之后包含换行符的文本节点,以及 test
元素)。没有明确的规则匹配 test
所以默认规则适用,对于元素意味着 <xsl:apply-templates/>
.
因此,当 a
模板触发时,它的 "current node list" 是 test
的所有 9 个子节点的集合。该列表由交替的文本节点(换行符)和元素节点(a
元素)组成,文本节点位于奇数位置,元素节点位于偶数位置。
如果您像这样为 test
添加了显式模板:
<xsl:template match="test">
<xsl:apply-templates select="*"/>
</xsl:template>
那么这将select 只有 4个a
元素节点作为当前节点列表,所以position()
会给你1, 2、3 和 4。