Xml 计算xpath谓词中的外部xpath表达式

Xml 计算xpath谓词中的外部xpath表达式,xml,xslt,xpath,predicate,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 -->

我对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表达式中每个上下文的

提前谢谢!!
Tobias

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


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

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

。。。jdbc:ResultSet/jdbc:Row[jdbc:external\u id=current()/../externalId]
两个问题

首先,正如@jasso所回答的,当计算谓词时,上下文由最后一步决定。从

谓词使用 相对于一个轴产生一个新的 节点集。对于中的每个节点 要筛选的节点集 PredicateExpr的计算方法是 节点作为上下文节点,使用 节点集中作为 上下文大小,并且具有邻近性 节点在节点集中的位置 相对于轴作为 上下文位置

第二。你写道:

如果我使用一个变量,它就会工作 ($externalId),但变量为 仅设置一次(第一个循环 迭代)

那不是真的。每个的
内容模板将为其所选节点集中的每个节点实例化一次。因此,
externalId
为每个这样的节点计算一次

那么@jasso的正确答案是:

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

... jdbc:ResultSet/jdbc:Row[jdbc:external_id = $externalId]
两个问题

首先,正如@jasso所回答的,当计算谓词时,上下文由最后一步决定。从

谓词使用 相对于一个轴产生一个新的 节点集。对于中的每个节点 要筛选的节点集 PredicateExpr的计算方法是 节点作为上下文节点,使用 节点集中作为 上下文大小,并且具有邻近性 节点在节点集中的位置 相对于轴作为 上下文位置

第二。你写道:

如果我使用一个变量,它就会工作 ($externalId),但变量为 仅设置一次(第一个循环 迭代)

那不是真的。每个
内容模板将为其所选节点集中的每个节点实例化一次。因此,
externalId
为每个这样的节点计算一次

那么@jasso的正确答案是:

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

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

添加
xslt
标记作为此XPath表达式由xsltading托管
xslt
标记作为此XPath表达式由XSLT@Alejandro,好答案+1。实际上,当你回答了一个问题时,我很少需要在你的回答中添加任何内容。@Dimitre:Ja!谢谢我也一样多亏了你们两位,才使它起作用:)带变量的方法一开始对我不起作用,因为我的输入xml有一个错误。。不过,很高兴了解current()-函数!Thanks@Alejandro,好答案+1。实际上,当你回答了一个问题时,我很少需要在你的回答中添加任何内容。@Dimitre:Ja!谢谢我也一样多亏了你们两位,才使它起作用:)带变量的方法一开始对我不起作用,因为我的输入xml有一个错误。。不过,很高兴了解current()-函数!谢谢