【问题标题】:Evaluate outer xpath-expression in xpath-predicate评估 xpath-predicate 中的外部 xpath-expression
【发布时间】:2010-08-26 15:41:00
【问题描述】:

我的 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?

提前致谢!! 托比亚斯

【问题讨论】:

  • 添加 xslt 标签,因为此 XPath 表达式由 XSLT 托管

标签: xml xslt xpath predicate


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    两个问题。

    首先,正如@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]
    

    【讨论】:

    • @Alejandro,好的答案 +1。在实践中,当你回答了一个问题后,我很少需要在你的答案中添加任何内容。
    • @Dimitre:Ja!谢谢!同样的事情发生在我身上。 ;)
    • 感谢你们两个,让它工作:) 使用变量的方法一开始对我不起作用,因为我的 input-xml 有问题。不过,很好了解 current() 函数!谢谢
    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 2018-03-31
    • 2013-07-13
    • 2022-08-24
    • 2013-11-04
    • 2015-03-24
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多