给定以下XML:

<Fruits>
  <TreeBearing>
      <Name>Apple</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Orange</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Grape</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Apple</Name>
  </TreeBearing>
</Fruits>


XPath应该如何检查每个<Name>是否包含单词ple

我尝试了/Fruits/TreeBearing/Name/text(),但我一直只获得第一个项目(即Apple)。如何遍历并获取所有包含ple的元素?

最佳答案

确切地给出此输入XML,类似

/Fruits/TreeBearing/Name[contains(text(),'ple')]


将检索所有Name元素


其第一个子文本节点包含ple(XPath 1.0)
其唯一的文本节点包含ple(XPath 2.0)。如果有多个子文本节点,则将导致错误,而您需要使用contains(.,'ple')


但是,在您输入的XML中,只有一个这样的元素。此外,如果有很多,您的XPath引擎可能只会返回第一个结果。

完全无关,但“水果”不是正确的英文复数形式-应该读为“水果”。




您的xpath还会返回布尔值还是Apple?


假设以下输入:

<Fruits>
  <TreeBearing>
      <Name>Apple1</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Orange</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Grape</Name>
  </TreeBearing>
  <TreeBearing>
      <Name>Apple2</Name>
  </TreeBearing>
</Fruits>


此路径表达式:

/Fruits/TreeBearing/Name[contains(text(),'ple')]


返回元素节点:

<Name>Apple1</Name>
-----------------------
<Name>Apple2</Name>


另一方面,

/Fruits/TreeBearing/Name[contains(text(),'ple')]/text()


只返回这些节点的文本内容:

Apple1
-----------------------
Apple2


最后,要返回表示您的输入中是否存在此类节点的布尔值,请使用

boolean(/Fruits/TreeBearing/Name[contains(text(),'ple')])

10-08 02:36