在嵌套元素中限制xpath

时间:2013-10-10 15:32:12

标签: xpath

我希望按部分查找所有索引术语,但是部分是嵌套的。这是一个简单的例子。

<chapter>
  <section><title>First Top Section</title>
    <indexterm text="dog"/>
    <para>
      <indexterm text="tree"/>
    </para>
    <section><title>SubSection</title>
      <indexterm text="cat"/>
    </section>
  </section>
  <section><title>Second Top Section</title>
    <indexterm text="elephant" />
  </section>
</chapter>

是否有任何xpath表达式可以获得如下结果:

First Top Section = ["dog", "tree"]
Subsection = ["cat"]
Second Top Section = ["elephant"]

当然,我将所有后代索引项都放在一个带有如下表达式的部分下:

/chapter/section//indexterm

但是indexterms可以在一个部分的其他元素中 - 它们不一定是孩子。

是否可以使用xpath获取特定于其父节的索引节点?

2 个答案:

答案 0 :(得分:1)

您可以在section级别添加谓词:

/chapter/section[title = 'First Top Section']//indexterm

但这将包括给定部分下的所有indexterm元素,包括子部分中的那些元素。要排除它们,您可以执行类似

的操作
/chapter/section[title = 'First Top Section']//indexterm[count(ancestor::section) = 1]

挑选那些只有一个section祖先的indexterm元素(即你开始使用的“First Top Section”)。

更一般地说,如果你有一个特定的section元素的引用,那么你可以通过首先评估

来获取其中的所有indexterm元素但不在子部分中。
count(ancestor-or-self::section)

作为数字,并以当前section元素作为上下文节点,然后构建另一个表达式

.//indexterm[count(ancestor::section) = thenumberyoujustcounted]

并将其作为节点集进行评估,再次使用原始section元素作为上下文节点。

答案 1 :(得分:1)

如果你可以使用XPath 2.0,你可以这样做:

XML输入

<chapter>
    <section><title>First Top Section</title>
        <indexterm text="dog"/>
        <para>
            <indexterm text="tree"/>
        </para>
        <section><title>SubSection</title>
            <indexterm text="cat"/>
        </section>
    </section>
    <section><title>Second Top Section</title>
        <indexterm text="elephant" />
    </section>
</chapter>

XPath 2.0

for $section in //section 
return concat($section/title,' - ["',
       string-join($section//indexterm[ancestor::section[1] is $section]/@text,
       '", "'),'"]&#xA;')

<强>输出

First Top Section - ["dog", "tree"]
SubSection - ["cat"]
Second Top Section - ["elephant"]