如何在子节点中选择包含某个子字符串的节点?

时间:2011-12-09 11:39:56

标签: xml xpath

我有一个类似结构的XML,包含许多项目:

<Items>
  <Item>
    <Name>Item name 1</Name>
    <Details>
      <Detail>ABC DEF</Detail>
      <Detail>GHI JKL</Detail>
    </Details>
  </Item>
  <Item>
    <Name>Item name 2</Name>
    <Details>
      <Detail>ABC DEF</Detail>
      <Detail>GHI MNO</Detail>
    </Details>
  </Item>
</Items>

如何在至少一个Detail子节点中获取包含子串“MNO”的所有Item节点的列表?

此表达式不返回具有描述“Item name 2”的预期Item:

/Items/Item[contains(Details/Detail, 'MNO')]

请指教。提前谢谢了! Vojtech

1 个答案:

答案 0 :(得分:4)

以下是工作变体:

/Items/Item[Details/Detail[contains(.,"MNO")]]

基本上,您的示例中发生了什么:仅在第一个Detail节点中搜索“MNO”字符串进行包含。因此,如果您要将XML更改为:

<Items>
  <Item>
    <Name>Item name 1</Name>
    <Details>
      <Detail>ABC DEF</Detail>
      <Detail>GHI JKL</Detail>
    </Details>
  </Item>
  <Item>
    <Name>Item name 2</Name>
    <Details>
      <!-- Nodes order was changed -->
      <Detail>GHI MNO</Detail>
      <Detail>ABC DEF</Detail>
    </Details>
  </Item>
</Items>

你的XPath可以正常工作。