【问题标题】:XPath query: How to refer to the 'current node' (Java/Saxon)XPath 查询:如何引用“当前节点”(Java/Saxon)
【发布时间】:2010-09-07 10:22:23
【问题描述】:

我正在为 XPath 解析器使用基于 Saxon 的 Java 应用程序。请考虑以下几点:

<import>  
  <record ref="abc">  
    <id>123</id>  
    <data>Value<data>  
  </record>  
  <record ref="def">  
    <parent>123</parent>  
    <data>Value2</data>  
  </record> 
</import> 

我的用例是,我正在遍历记录节点,需要查找另一个属性 ref 等于子父节点下的值的节点。

如果当前节点是&lt;record ref="def"&gt;,如何编写查询以通过匹配/query/record/id/text() = current node/parent/text()返回第一个记录节点内的数据节点?

如果我执行这个查询:

/import/record[id/text() = '123']/data

然后我得到了正确的数据节点,但我似乎无法将“123”替换为父节点下的值?

我尝试替换 '123' with ./parent/text(),当 XPath 编译时,没有返回任何结果。

谢谢,

JB

【问题讨论】:

    标签: java xpath saxon


    【解决方案1】:

    随着您在路径上下文中引用节点的时间,您应该能够使用变量来解决您的问题:

    <xsl:template match="/import/record[@parent]">
        <xsl:variable name="pid" select="./parent/text()" />
        <xsl:for-each select="/import/record[id/text() = $pid">
            <!-- actions -->
        </xsl:for-each>
    </xsl:template>
    

    编辑

    您可能会使用类似以下单个 xpath 表达式的内容:

    /import/record[id/text() = /import/record/parent/text()]/data
    

    (选择那些被其他人引用的记录)

    【讨论】:

    • 非常感谢您花时间写出来,但我没有使用 XLST。我正在对 DOM 使用直接 XPath。
    • 您可以在代码中使用相同的方法,还是必须在一个单一的路径表达式中?
    • 一个表达式。我看到 XLST 有最新的,但在解析 DOM 时似乎没有规定 - 请参阅函数列表:saxonica.com/documentation/functions/intro.html
    • 我想我可以编写自己的函数来提供 current() 但这似乎很明显,它应该在 Saxon/XPath API 中可用。
    【解决方案2】:

    句点用于引用当前节点。但是你的逻辑有一个缺陷:你的路径是什么

    /import/record[id/text() = ./parent/text()]/data
    

    定义了一个&lt;record&gt;,它有一个parent 一个id 必须具有相同内容的子级。

    【讨论】:

    • 对,那我怎么才能引用当前节点(,我传入XPath评估方法的那个),这样才能使用parent下的值呢?
    • 知道了! /import/record[id = /import/record[position()]/parent]/data
    【解决方案3】:

    由于某种原因,current() 存在于 XSLT 中,但不适用于针对 DOM 的 XPath。你可以像这样硬编码:

    /import/record[id = /import/record[position()]/parent]/data

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多