评估完整的子树存在

时间:2013-12-09 08:03:29

标签: xml xpath

我经常想在整个子树中存在某个元素时使用XPATH表达式过滤一个元素,我想知道是否可以让xpath表达式匹配所有结果。如果第一个要匹配的元素(true匹配但不匹配Cd[2]),则以下表达式仅评估为Cd[3]

xpath::evaluate(" //CuorS/Cd[ starts-with(./*/@Name], 'Dog')]")
<CuorS>
  <Cd>
    <Ani Name="CatOne" />
    <Bodi Name="Fish"  />
  </Cd>
  <Cd>
    <Ani Name="DogOne" />
    <Bodi Name="Fish"  />
  </Cd>
  <Cd>
    <Ani Name="Owl" />
    <Bodi Name="DogTwo"  />
  </Cd>
</CuorS>

我知道我可以将表达式表达为

xpath::evaluate("//CuorS/Cd/*[ starts-with(./@Name], 'Dog')]/..")

匹配所有,但我正在寻找匹配存在的过滤器表达式:'如果该子树中有一个匹配元素'。我可以评估结果序列的函数而不仅仅是一个吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

xPath表达式如何:

//CuorS/Cd[ count(./*[starts-with(@Name, 'Dog')]) >= 1]

这只计算匹配的子节点(以&#34; Dog&#34开头的那些节点)。 因此,它匹配每个具有至少一个与该条件匹配的子节点的Cd。

正如您所看到的,当您嵌套条件块时,它变得非常容易。通过嵌套它们,您还可以按照您的要求对节点序列进行此评估(不要完全理解您要在那里实现的目标)。

以下是xPath的输出(给定您的示例输入):

  <Cd> 
    <Ani Name="DogOne"/>  
    <Bodi Name="Fish"/> 
  </Cd>
  <Cd> 
    <Ani Name="Owl"/>  
    <Bodi Name="DogTwo"/> 
  </Cd>

答案 1 :(得分:1)

移动谓词:

xpath::evaluate("//CuorS/Cd[*[starts-with(./@Name]], 'Dog')]")

这将匹配CuorS的所有Cd子项,这些子项具有名称以Dog开头的子元素。根据您使用的XPath处理器和编程语言,您甚至可以评估为布尔值:

xpath::evaluate("boolean(//CuorS/Cd[*[starts-with(./@Name]], 'Dog')])")

如果结果序列为空,则会产生false,如果至少有一个元素,则返回true。