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

时间:2015-03-04 13:15:24

标签: xml xslt xpath

我有这个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元素内,测试它是否位于章节内,category属性设置为“MAINTENANCE”

2)如果在listitem元素内,测试是否还有其他listitem

我只需要陈述。

1 个答案:

答案 0 :(得分:2)

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

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

和(2)使用preceding-sibling::

preceding-sibling::listitem

如果当前上下文节点是listitem,如果&#34;在listitem元素内,那么这是有效的&#34;可能包括后代节点(para元素节点或其中的文本节点)然后你需要更像

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

(如果当前上下文节点不是listitem,请在树上直到你点击一个,然后从那里,查看是否有任何前面的listitem兄弟节点)