我经常想在整个子树中存在某个元素时使用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')]/..")
匹配所有,但我正在寻找匹配存在的过滤器表达式:'如果该子树中有一个匹配元素'。我可以评估结果序列的函数而不仅仅是一个吗?
谢谢!
答案 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。