Xpath:如果在节点内部,测试是否位于某个属性内部,是否有另一个类似的节点

Xpath: If inside a node, test to see if it is located inside a certain attribute and if there is another similar node

我有这个 xml 文件

<book>
<chapter category="AIRCRAFT">
  <title>Flight Controls</title>
  <section>Bombardier</title>
    <orderedlist>
        <listitem><para>list item 1</para></listitem>
        <listitem><para>list item 2</para></listitem>
        <listitem><para>list item 3</para></listitem>
    </orderedlist>
  </section>
</chapter>

<chapter category="PILOT">
  <title>Flight Operations</title>
  <section>
    <title>Crew Bases</title>
    <orderedlist>
        <listitem><para>list item 1</para></listitem>
        <listitem><para>list item 2
            <note>
                <para>Note: Additional information.</para>
            </note>
            </para>
        </listitem>
        <listitem><para>list item 3</para></listitem>
    </orderedlist>
  </section>
</chapter>

<chapter category="MAINTENANCE">
  <title>Maintenance</title>
  <section>
    <title>Maintenance Bases</title>
    <orderedlist>
        <listitem><para>list item 1</para></listitem>
        <listitem><para>list item 2</para></listitem>
        <listitem><para>list item 3</para></listitem>
    </orderedlist>
  </section>
</chapter>

<chapter category="COMPANY">
  <title>Company Policy Manual</title>
  <section>
    <title>Employment Standards and Eligibility</title>
    <orderedlist>
        <listitem><para>list item 1</para></listitem>
        <listitem><para>list item 2</para></listitem>
        <listitem><para>list item 3</para></listitem>
    </orderedlist>
  </section>
</chapter>

</book>  

我需要回答这两个问题:

1)如果在 para 元素内,测试它是否位于类别属性设置为“MAINTENANCE”的章节内

2)如果在一个listitem元素中,测试它之前是否有另一个listitem

我只需要语句。

您可以使用 ancestor:: 轴执行 (1):

ancestor::chapter[1]/@category = 'MAINTENANCE'

和 (2) 使用 preceding-sibling::

preceding-sibling::listitem

如果当前上下文节点是 listitem,如果 "inside a listitem element" 可以包含后代节点(para 元素节点或其中的文本节点),那么您将需要更多类似

的东西
ancestor-or-self::listitem[1]/preceding-sibling::listitem

(如果当前上下文节点不是listitem,往树上走,直到碰到一个,然后从那里,看前面有没有listitem兄弟姐妹)