有关XPath功能的问题

Kev*_*vin 3 xml xslt xpath

这是我之前的帖子的后续问题:

请帮助我理解这个XPath

我有一个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-templatesfor-each指令.

现在添加apply-templates一些select属性的指令select="a":

<list>
    <a>2 + 2 = 4</a>
</list>
Run Code Online (Sandbox Code Playgroud)