选择当前元素和当前元素的下一个元素之间的所有元素

时间:2013-04-22 11:17:10

标签: xslt xpath xslt-1.0

使用XSLT 1.0(最好),如何选择当前元素和下一次当前元素之间出现的所有元素?

说我有这个XML(已编辑):

<root>
    <heading_1>Section 1</heading_1>
    <para>...</para>
    <list_1>...</list_1>
    <heading_2>Section 1.1</heading_2>
    <para>...</para>
    <heading_3>Section 1.1.1</heading_3>
    <para>...</para>
    <list_1>...</list_1>
    <heading_2>Section 1.2</heading_2>
    <para>...</para>
    <footnote>...</footnote>
    <heading_1>Section 2</heading_1>
    <para>...</para>
    <list_1>...</list_1>
    <heading_2>Section 2.1</heading_2>
    <para>...</para>
    <list_1>...</list_1>
    <list_2>...</list_2>
    <heading_3>Seciton 2.1.1</heading_3>
    <para>...</para>
    <heading_2>Section 2.2</heading_2>
    <para>...</para>
    <footnote>...</footnote>
</root>

处理heading_1时,我想在我正在处理的标题和下一个heading_2之间选择所有heading_1。在处理heading_3等时选择heading_2也是一样的。你得到了图片。

2 个答案:

答案 0 :(得分:3)

您可以使用:

following-sibling::heading_2[generate-id(preceding-sibling::heading_1[1]) = 
                             generate-id(current())]

工作示例:

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

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:apply-templates select="heading_1" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="heading_1">
    <xsl:copy>
      <xsl:apply-templates
        select="following-sibling::heading_2[generate-id(
                                                preceding-sibling::heading_1[1]) = 
                                             generate-id(current())]" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="heading_2">
    <xsl:copy>
      <xsl:apply-templates
        select="following-sibling::heading_3[generate-id(
                                                preceding-sibling::heading_2[1]) = 
                                             generate-id(current())]" />
    </xsl:copy>
  </xsl:template>    
</xsl:stylesheet>

运行样本输入时的结果:

<root>
  <heading_1>
    <heading_2>
      <heading_3>...</heading_3>
    </heading_2>
    <heading_2 />
  </heading_1>
  <heading_1>
    <heading_2>
      <heading_3>...</heading_3>
    </heading_2>
    <heading_2 />
  </heading_1>
</root>

答案 1 :(得分:0)

在处理标题1时,尝试使用以下XPath选择heading2。

(/root/heading_1/following-sibling::heading_1/preceding-sibling::heading_2) | (/root/heading_1[preceding-sibling::heading_1]/following-sibling::heading_2)