Xml 计算xpath谓词中的外部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 -->
<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='CA']/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='CA']/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()-函数!谢谢