如何在使用XSLT达到条件之前获得父母兄弟姐妹的价值

时间:2017-07-24 15:46:23

标签: xslt xpath

我是XSLT的新手,这是我的xml

<q>
  <w>
    <p>
      <b>b1</b>
    </p>
    <p>p1</p>
    <p>p2</p>
    <p>p3</p>
    <p>
      <b>b2</b>
    </p>
    <p>
      <b>b3</b>
    </p>
    <p>p4</p>
    <p>p5</p>
    <p>
      <b>b4</b>
    </p>
    <p>p6</p>
  </w>
</q>

我需要输出看起来像这样

<position_1_b1>
  <p>p1</p>
  <p>p2</p>
  <p>p3</p>
</position_1_b1>
<position_2_b3>
  <p>p4</p>
  <p>p5</p>
</position_2_b3>
<position_3_b4>
  <p>p6</p>
</position_3_b4>

输出中没有与b2相关的标记因为下一个&#39; P&#39;元素有一个元素&#39; B&#39;在它!

<p><b>b2</b></p>
<p><b>b3</b></p>

提前致谢!!

1 个答案:

答案 0 :(得分:0)

您可以在XSLT2.0中使用分组

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output indent="yes"></xsl:output>
<xsl:template match="w">
    <xsl:for-each-group select="*" group-starting-with="p[b][following-sibling::*[1][self::p][not(b)]]">
        <xsl:element name="{concat('position_', position(), '_', normalize-space(.))}">
            <xsl:apply-templates select="current-group() except self::p[b]"/>
        </xsl:element>
    </xsl:for-each-group>
</xsl:template>

<xsl:template match="p[not(b)]">
    <p>
        <xsl:apply-templates/>
    </p>
</xsl:template>

<xsl:template match="p[b]"/>