XPath无法获得匹配子项的整个树

时间:2016-05-18 03:46:40

标签: xml xpath

鉴于此XML:

WITH

为什么/订单/订单[项目[@name =' 123']]会返回:

<Orders>
    <Order>
        <Item name="xyz"/>
    </Order>
    <Order>
        <Item name="123"/>
    </Order>
</Orders>

但是/订单[订单[项目[@name =&#39; 123&#39;]]]返回:

<Order>
    <Item name="123" />
</Order>

在第二种情况下,名称上的匹配将被忽略。

我需要什么XPath才能回来:

<Orders>
    <Order>
        <Item name="xyz" />
    </Order>
    <Order>
        <Item name="123" />
    </Order>
</Orders>

2 个答案:

答案 0 :(得分:2)

第二个例子返回它的原因是因为你的表达式

/Orders[Order[Item[@name='123']]]

表示:

  1. 找到Orders节点
  2. 包含Order nmde
  3. 包含Item节点
  4. Item个节点的属性name的值为123
  5. 请注意,您专注于Orders节点,这就是返回的内容,即整个 Orders节点。

    源文档中不存在您想要的内容,因此您要求进行转换。我的XPath有些生疏,但我不相信XPath本身就能做到这一点。您可能需要使用XSLT将XML转换为您需要的。

答案 1 :(得分:0)

简短的回答是,鉴于发布的XML,您无法使用XPath获得该输出。

XPath用于定位XML的一部分(尤其是XPath 1.0)。请注意,开始标记,内容和相应的结束标记被视为一个单元,即元素节点。因此,只包含一个您希望返回的<Orders>子元素的<Order>元素不是原始XML的一部分,因此无法使用XPath返回。

  

XPath是一种用于处理XML文档部分的语言,旨在供XSLT和XPointer使用。 [参考:XPath 1.0 Spec]