2

我将基于 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

4

3 回答 3

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

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

于 2010-09-07T11:14:10.043 回答
0

句点用于指代当前节点。但是,您的逻辑有一个缺陷:您的路径是什么

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

定义是<record>具有 aparent 一个id必须具有相同内容的子级的 a。

于 2010-09-07T10:33:22.670 回答
0

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

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

于 2010-09-07T15:01:39.387 回答