【问题标题】:XPATH: Count Preceding Elements Within Ancestor NodesXPATH:计算祖先节点中的先前元素
【发布时间】:2017-04-12 21:27:43
【问题描述】:

我在使用 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))," ")'

【问题讨论】:

  • 你用什么来处理你的xpath?您是否使用 xpath 作为 XSLT 的一部分? (如果是这样,xsl:number 会很有帮助。)
  • 嗨丹尼尔 - 感谢您的洞察力。不幸的是,我被限制在我的部署的 css 文件中的函数中进行计数......它非常具体,并且是 Oxygen XML Author 独有的。

标签: xml xpath counting


【解决方案1】:

该问题至少部分是由 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 )," " )'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多