XPATH:计算祖先节点中的前置元素

时间:2017-04-12 21:27:43

标签: xml xpath counting

我在使用XPATH时遇到问题,可以使用一些指导。我已经使用了w3schools教程 - 而且还不够先进,无法帮助我弄清楚我做错了什么。 (我预计将来需要更多地使用XPATH - 所以推荐好的教程或书籍也会受到赞赏。)

我正在制作一本包含可选标题列表的书。如果使用了listTitle,我想在标题中预先列出一个列表编号,连接章节和列表编号(基于listTitle)。不包含listTitle的列表不应增加列表计数器。

这是一个示例xml文件,显示了所需的结果:

<chapter><title>Chapter 1></title>
    <para>Para text.</para>
    <ul><listTitle>List 1-1</listTitle> .... </ul>

    <section><title>Section 1.1</title>
    <ol> .... </ol>
    <ol><listTitle>List 1-2</listTitle> ... </ol>
    </section>

    <ol><listTitle>List 1-3</listTitle> ... </ol>
    <ul><listTitle>List 1-4</listTitle> ... </ul>
</chapter>

<chapter><title>Chapter 2></title>
    <para>Para text.</para>
    <ul><listTitle>List 2-1</listTitle> .... </ul>

    <section><title>Section 2.1</title>
    <ol> .... </ol>
    <ol><listTitle>List 2-2</listTitle> ... </ol>
    </section>

    <ol><listTitle>List 2-3</listTitle> ... </ol>
    <ul><listTitle>List 2-4</listTitle> ... </ul>
</chapter>

但实际结果略有不同。我的listTitle计数不会在章级别重新开始...所以listTitles会继续计数(也就是说,而不是List 2-1,我得到了List 2-5)。我只是无法弄清楚如何指定章节关系以在章级别重置计数。

我的XPATH:

'concat("List ",count(../preceding::chapter)+1," - ",(count(preceding::*:ol/*:listTitle)
 + count(ancestor::*:ol/*:listTitle)+ count(preceding::*:ul/*:listTitle) 
 + count(ancestor::*:ul/*:listTitle))," ")'

1 个答案:

答案 0 :(得分:0)

这个问题至少部分是由于xmlns问题造成的。

这篇StackOverflow文章帮助:XML element has namespace, my XPATH does not work

以下代码提供了正确的列表标题计数:

('concat("List ", count(preceding::chapter)+1,"-", for $i in
count(preceding::chapter) return ((count(//parent::basicDocument//
chapter[$i+1]//*[name() = "listTitle"] intersect preceding::* ) ) + 1 )," " )'