Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT2:如何在XPath2谓词中引用有关当前节点的属性_Xpath_Xslt 2.0_Xpath 2.0 - Fatal编程技术网

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

XSLT2:如何在XPath2谓词中引用有关当前节点的属性,xpath,xslt-2.0,xpath-2.0,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

我已经将此作为它的一个方面发布了。我被告知要澄清这个问题,但这个问题已经相当长和复杂,所以我创建了一个新的问题

我想知道是否有在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>

在会议期间,马铃薯有s.c.c.叶子。

(问题底部的XML源代码。) (注意,for each引用类型为stem[eye]的节点,但第二个值请求引用类型为stem[scc]的节点,它们位于源XML树的不同分支上。)

现在,显然,“@sessionID=@sessoinID”部分基本上没有意义,因为XPath将其视为“节点的sessionID属性的值应该等于……节点的sessionID属性的值。”

但我想说的是“测试以确保该节点(XPath表达式中的那个)的seesionID属性的值与我现在所在的/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片s.c.c.叶子

在第三阶段,马铃薯有463片s.c.c.叶子


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

使用例如
current()/@sessionID
来访问当前处理的节点的
sessionID
属性(例如,由示例中的for each处理的节点或由具有推送处理的应用模板处理的节点)。

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

/potato/stem[@sessionID=current()/@sessionID][scc]/scc/@leafnumber
或通过定义键(在全局级别上):

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


谢谢这正是我想弄明白的。究竟为什么我的XSLT书从来没有提到这个函数??[XMLforDummies在XSLT上花费了130多页,从来没有提到过这个函数。]哇,我也不知道“key”这个词。嘘!我有一本多么糟糕的书啊。我还需要更多地研究范围变量。这很有帮助。@DavidR:不客气。顺便说一句,我纠正了我答案中的一个输入错误——在
key()
示例中遗漏了第二个参数。现在没事了。
<xsl:key name="kPotById" match="stem[scc]" use="@sessionID"/>
key('kPotById', @sessionID)/scc/@leafnumber
for $thisSessionID in @sessionId
 return
    /potato/stem[@sessionID=$thisSessionID][scc]/scc/@leafnumber