我是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>
提前致谢!!
答案 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]"/>