我不明白以下的行为:
输入XML
<?xml version="1.0" encoding="UTF-8"?>
<list>
<article>Title1</article>
<other>Other</other>
<article>Title2</article>
<article>Title3</article>
</list>XSL 1:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:template match="list">
<xsl:apply-templates select="article" />
</xsl:template>
<xsl:template match="list/*">
Content: <xsl:value-of select="."/> | Position: <xsl:value-of select="position()"/> | Last: <xsl:value-of select="last()"/>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>输出XSL1
<?xml version="1.0" encoding="UTF-8"?>
Content: Title1 | Position: 1 | Last: 3
Content: Title2 | Position: 2 | Last: 3
Content: Title3 | Position: 3 | Last: 3到目前一切尚好。
现在,如果将上面的匹配从list/*更改为list/*[2],则不会得到任何输出。我认为这是因为第二个项目是<other>,它与select="article"不匹配。
奇怪的是,当我把比赛改为list/*[3]时,我得到了位置为2的线:
<xsl:template match="list/*[3]">
Content: <xsl:value-of select="."/> | Position: <xsl:value-of select="position()"/> | Last: <xsl:value-of select="last()"/>
</xsl:template>
<?xml version="1.0" encoding="UTF-8"?>
Content: Title2 | Position: 2 | Last: 3 为什么position()在模板中的工作方式不同于match子句?
发布于 2017-04-10 21:13:54
这个XPath表达式
list/*[3]表示<list>元素的第三个子元素。节点测试[3]相对于前面路径表达式选择的节点进行评估。
另一方面,XSLT第4节指定
最外层的表达式(即不属于另一个表达式的表达式)的上下文如下: ..。
在模板正文中,position()和last()显示为最外层的表达式。因此,它们相对于当前节点列表进行评估,并且该模板仅在当前节点列表由以下三个节点组成时应用。
<xsl:apply-templates select="article" />当<list>是当前节点时。该节点列表恰好包含三个节点,无论模板匹配了多少节点或匹配哪个节点。此外,给定节点在该节点列表中的位置不一定与该节点在由模板匹配表达式的子表达式list/*匹配的节点列表中的位置相同,也不一定与其在由模板的完全匹配表达式匹配的节点列表中的位置相同。职位措施之间只有一种偶然的关系。
https://stackoverflow.com/questions/43329186
复制相似问题