XPath - 通过分析以下sibllings来选择节点

时间:2015-09-09 09:05:59

标签: xml xslt xpath xslt-2.0

我有以下XML文档,

<doc>
    <h1>aa</h1>
    <p>bb</p>
    <p>cc</p>

    <h1>dd</h1>
    <p>ee</p>
    <h2>ff</h2>
    <h2>gg</h2>

    <h1>jj</h1>
    <p>kk</p>
    <p>ll</p>

    <h1>hh</h1>
    <h2>ii</h2>
    <p>jj</p>
</doc>

我需要编写一个XPath查询来获取<h1>个节点,其中存在以下兄弟<h2>个节点,然后再出现另一个<h1>节点。在这种情况下,应选择第2和第4个<h1>节点。 (<h2>个节点存在于另一个<h1>节点之前的后续sibligs中。

我试着这么做几个小时但想不出任何合适的解决方案来获取这些节点?

有人可以建议一种方法,我该怎么做?

2 个答案:

答案 0 :(得分:2)

找到h2并在前面加上h1

 //h2/preceding-sibling::h1[1]

结果

Element='<h1>dd</h1>'
Element='<h1>hh</h1>'

答案 1 :(得分:1)

选择在h1和h2节点之间具有h2作为第一个h1节点的h1节点

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/doc">
        <xsl:for-each select="h1[following-sibling::*[self::h1 or self::h2][1][self::h2]]">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>