在xpath-predicate中计算外部xpath-expression

时间:2010-08-26 15:41:00

标签: xml xslt xpath predicate

我遇到了xpath语句的问题。

基本上,可以通过以下代码解释该问题:

<xsl:for-each select="/b1im:B1IMessage/b1im:Header/b1im:Z/SortInbound/group">
                    <!-- Check if entry from duplicate table is found for the current AccountingEntry -->
                    <xsl:variable name="externalId" select="../externalId"></xsl:variable>
                    <xsl:value-of select="/b1im:B1IMessage/b1im:Body/b1im:Payload[@ObjectRole=&apos;CA&apos;]/jdbc:SqlResult/jdbc:ResultSet/jdbc:Row[jdbc:external_id= /../externalId]/jdbc:external_id"></xsl:value-of>
                    <xsl:variable name="group" select="./@id"></xsl:variable>                        
                    <!-- if it is no dupe => output -->
                     <xsl:choose>
                            <xsl:when test="/b1im:B1IMessage/b1im:Body/b1im:Payload[@ObjectRole=&apos;CA&apos;]/jdbc:SqlResult/jdbc:ResultSet/jdbc:Row[jdbc:external_id = ../externalId]/jdbc:external_id">

我想要做的是,使用“../externalId”(for-each的上下文)的值进行测试(最后一行)..如果我使用变量($ externalId),它会起作用,但是变量只设置一次(第一次循环迭代)...... 有没有办法可以访问xpath-expression中的for-each-context?

提前致谢!! 托拜厄斯

2 个答案:

答案 0 :(得分:2)

在XPath评估的每个步骤中,“.”(即上下文节点)具有不同的含义。在你的XPath表达式中 ... jdbc:ResultSet/jdbc:Row[jdbc:external_id = ../externalId]谓词中的上下文节点由XPath表达式中的前面步骤确定,因此您实际上是与externalID元素的jdbc:ResultSet子进行比较。要与for-each上下文节点的../externalID的值进行比较,您可以尝试使用XSLT函数current()

... jdbc:ResultSet/jdbc:Row[jdbc:external_id = current()/../externalId]

答案 1 :(得分:1)

两个问题。

首先,正如@jasso所回答的,在评估谓词时,上下文是由最后一步确定的。来自http://www.w3.org/TR/xpath/#predicates

  

谓词过滤节点集   尊重轴以产生新的   节点集。对于每个节点   要过滤的节点集,   PredicateExpr用它进行评估   节点作为上下文节点,用   节点集中的节点数为   上下文大小,与附近   节点在节点集中的位置   相对于轴而言   背景位置

二。你写道:

  

如果我使用变量,它会起作用   ($ externalId),但变量是   只设置一次(第一次循环   迭代)...

那不是真的。 for-each内容模板为其所选节点集中的每个节点实例化一次。因此,externalId会为每个此类节点评估一次。

所以,来自@jasso的正确答案:

... jdbc:ResultSet/jdbc:Row[jdbc:external_id = current()/../externalId]

与:

相同
... jdbc:ResultSet/jdbc:Row[jdbc:external_id = $externalId]