这是我之前的帖子的后续问题:
我有一个XPath:
<xsl:value-of select="position()+count(preceding-sibling::*)-18"/>
Run Code Online (Sandbox Code Playgroud)
目前我只能理解它的部分,比如position().另外,我知道previous-sibling是在当前节点之前选择所有兄弟节点,但我不知道当它们如上所述组合时该语句是什么意思.
任何人都可以帮助理解这个XPath吗?提前致谢.
小智 5
您的表达式是使用静态位置(来自输入源)和动态位置(来自当前节点列表)进行一些计算.
让我们看一些例子.假设这个样式表和这个输入:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="list">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:value-of select="concat(position(),' + ',
count(preceding-sibling::*),' = ',
position() +
count(preceding-sibling::*))"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<list>
<a/>
<b/>
<a/>
<b/>
</list>
Run Code Online (Sandbox Code Playgroud)
输出:
<list>
<a>1 + 0 = 1</a>
<b>2 + 1 = 3</b>
<a>3 + 2 = 5</a>
<b>4 + 3 = 7</b>
</list>
Run Code Online (Sandbox Code Playgroud)
现在,将第二条规则更改为match="a"
:
<list>
<a>1 + 0 = 1</a>
<a>3 + 2 = 5</a>
</list>
Run Code Online (Sandbox Code Playgroud)
因此,模式不会更改当前节点列表
如果position()
是模式怎么办?让我们将规则更改为match="a[position()=2]"
:
<list>
<a>3 + 2 = 5</a>
</list>
Run Code Online (Sandbox Code Playgroud)
奇怪?否.在XPath模式position()
中,它针对自己的上下文节点列表和轴方向.这种情况:child::a[position()=2]
意思是第二个a
孩子.
这表明position()
模式在不同的上下文中工作,而不是position()
在内容模板中.
那么,如何更改当前上下文节点列表?那么,apply-templates
和for-each
指令.
现在添加apply-templates
一些select
属性的指令select="a"
:
<list>
<a>2 + 2 = 4</a>
</list>
Run Code Online (Sandbox Code Playgroud)