5

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

我想知道在另一个 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>

(此问题底部的 XML 源代码。)(请注意,for-each 引用类型为 stem[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>

我正在寻找的输出是:

在会话 1 中,马铃薯有 234 片 scc 叶子。

在第 3 次会议中,马铃薯有 463 片 scc 叶子。

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

4

2 回答 2

10

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

/potato/stem[@sessionID=current()/@sessionID][scc]/scc/@leafnumber

或通过定义一个键(在全局级别):

<xsl:key name="kPotById" match="stem[scc]" use="@sessionID"/>

并引用此密钥:

key('kPotById', @sessionID)/scc/@leafnumber

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

for $thisSessionID in @sessionId
 return
    /potato/stem[@sessionID=$thisSessionID][scc]/scc/@leafnumber
于 2011-10-28T12:18:33.717 回答
7

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

于 2011-10-28T10:01:37.347 回答