XPATH:计算祖先节点中的前面元素
XPATH: Count Preceding Elements Within Ancestor Nodes
我在使用 XPATH 时遇到问题,需要一些指导。我已经使用了 w3schools 教程 - 它不够先进,无法帮助我弄清楚我做错了什么。 (我预计将来需要更多地使用 XPATH - 因此推荐好的教程或书籍也将不胜感激)。
我正在写一本包含可选标题列表的书。如果使用 listTitle,我想 pre-pend 标题的列表编号连接章节和列表编号(基于 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))," ")'
这个问题至少部分是由 xmlns 问题引起的。
这篇 Whosebug 文章帮助了: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 )," " )'
我在使用 XPATH 时遇到问题,需要一些指导。我已经使用了 w3schools 教程 - 它不够先进,无法帮助我弄清楚我做错了什么。 (我预计将来需要更多地使用 XPATH - 因此推荐好的教程或书籍也将不胜感激)。
我正在写一本包含可选标题列表的书。如果使用 listTitle,我想 pre-pend 标题的列表编号连接章节和列表编号(基于 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))," ")'
这个问题至少部分是由 xmlns 问题引起的。
这篇 Whosebug 文章帮助了: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 )," " )'