我遇到了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='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-expression中的for-each-context?
提前致谢!! 托拜厄斯
答案 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]