0

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

<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

但是索引项可以在一个节中的其他元素内——它们不一定是子元素。

是否可以使用 xpath 获取特定于其父部分的索引项?

4

2 回答 2

1

section您可以在级别放置谓词:

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

但这将包括给定部分下的所有索引词元素,包括小节中的元素。要排除它们,您可以执行类似的操作

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

挑选出那些只有一个section祖先的索引项元素(即您开始使用的“第一个顶部部分”)。

更一般地说,如果您有对特定section元素的引用,那么您可以通过首先评估来获取其中的所有索引项元素,但不能在小节内

count(ancestor-or-self::section)

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

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

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

于 2013-10-10T15:42:14.037 回答
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"]
于 2013-10-10T15:58:49.330 回答