我正在使用基于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
答案 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