XSLT2:如何在XPath2谓词中引用有关当前节点的属性

Dav*_*d R 4 xpath xslt-2.0 xpath-2.0

我发布了另一个问题作为它的一个方面.我被告知要澄清这个问题,但这个问题已经很长很复杂了,所以我创建了一个新问题.

我想知道在XPath表达式测试中是否存在引用当前节点属性的标准方法.

例如,请考虑以下XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <xsl:for-each select="potato/stem[eye]">
        In session <xsl:value-of select="@sessionID"/>, the potato had <xsl:value-of select="/potato/stem[@sessionID=@sessionID][scc]/scc/@leafnumber"/> s.c.c. leaves.
    </xsl:for-each>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

(此问题底部的XML源.)(请注意,for-each引用了类型为[eye]的节点,但请求的第二个值引用了类型为stem [scc]的节点,这些节点位于源XML树的不同分支上.)

现在,显然,"@ sessionID = @sessoinID"部分大部分都没有意义,因为XPath将其视为"节点的sessionID属性的值应该等于......节点的sessionID属性的值."

但我想说的是"测试以确保该节点的seesionID属性的值(XPath表达式中的那个)与我所在的/ stem [eye]节点的节点的sessionID相同马上."

我无法使用变量执行此操作,因为不允许在for-each子句中声明变量.

作为参考,这是XML源.它的结构不是人们想要的,但它是我必须要合作的.

<?xml version="1.0" encoding="utf-8"?>
<potato>
<stem sessionID="1">
    <eye number = "25"/>
</stem>
<stem sessionID="3">
    <eye number = "33"/>
</stem>

<stem sessionID="1">
    <scc leafnumber = "234" />
</stem>
<stem sessionID="2">
    <scc leafnumber = "433"/>
</stem>
<stem sessionID="3">
    <scc leafnumber = "463"/>
</stem>

<stem sessionID="1">
    <agd leafnumber = "154"/>
</stem>
<stem sessionID="2">
    <agd leafnumber = "233"/>
</stem>
<stem sessionID="3">
    <agd leafnumber = "113"/>
</stem> 
</potato>
Run Code Online (Sandbox Code Playgroud)

我正在寻找的输出是:

在第1阶段,马铃薯有234片scc叶子.

在第3节中,马铃薯有463个scc叶.

(当然,这只是沙箱的例子.我意识到可能有简单的方法以完全不同的方式完成上述输出,但我希望这个例子能够解决我的问题,即如何使用与当前节点相关的值(例如,在for-each中)在XPath中搜索不同的谓词.)

Dim*_*hev 8

在XSLT 1.0中,您可以使用标准函数current(),该函数引用当前模板或最内层模板匹配的节点xsl:for-each:

/potato/stem[@sessionID=current()/@sessionID][scc]/scc/@leafnumber
Run Code Online (Sandbox Code Playgroud)

或者通过定义密钥(在全球范围内):

<xsl:key name="kPotById" match="stem[scc]" use="@sessionID"/>
Run Code Online (Sandbox Code Playgroud)

并引用此键:

key('kPotById', @sessionID)/scc/@leafnumber
Run Code Online (Sandbox Code Playgroud)

在XSLT 2.0/XPath 2.0中,您还有其他表达方式(范围变量):

for $thisSessionID in @sessionId
 return
    /potato/stem[@sessionID=$thisSessionID][scc]/scc/@leafnumber
Run Code Online (Sandbox Code Playgroud)


Mar*_*nen 5

使用例如current()/@sessionID访问sessionID当前处理的节点的属性(例如,样本中由for-each处理的属性或通过推送处理的apply-templates).