XPath查询:如何引用'当前节点'(Java / Saxon)

时间:2010-09-07 10:22:23

标签: java xpath saxon

我正在使用基于Saxon的Java应用程序来获取XPath解析器。请考虑以下事项:

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

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

如果当前节点为<record ref="def">,如何通过匹配/query/record/id/text() = current node/parent/text()来编写查询以返回第一个记录节点中的数据节点?

如果我执行此查询:

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

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

我已尝试替换'123' with ./parent/text()并在XPath编译时,不会返回任何结果。

谢谢,

JB

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

该句号用于表示当前节点。但是你的逻辑有一个缺陷:你的道路是什么

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

定义是一个<record>,其parent 一个id子项必须具有相同的内容。

答案 2 :(得分:0)

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

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