我希望按部分查找所有索引术语,但是部分是嵌套的。这是一个简单的例子。
<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获取特定于其父节的索引节点?
答案 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
元素的引用,那么你可以通过首先评估
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,
'", "'),'"]
')
<强>输出强>
First Top Section - ["dog", "tree"]
SubSection - ["cat"]
Second Top Section - ["elephant"]