Search code examples
xsltxpathxslt-2.0line-breaks

XSLT: in a <p> element, how to replace a line break (<br/>) with successive <alinea> element?


I am trying to transform a <p> element with <br/> elements within into several <alinea>subtext</alinea>. For instance :

<p>subtext<br/>some more text<br/> some more subtext</p>

From the previous <p> I was hoping to simply replace all <br/> into </alinea><alinea> since the template for <p> opens a <alinea> element already.

<xsl:template match="p">
    <para><alinea><xsl:apply-templates/></alinea></para>
</xsl:template>

<xsl:template match="br">
    </alinea><xsl:apply-templates/><alinea>
</xsl:template>

But it is doesn't validate.

Expected result :

<para>
   <alinea>
     subtext
   </alinea>
   <alinea>
     some more text
   </alinea>
   <alinea>
     some more subtext
   </alinea>
 </para>

Solution

  • This is quite easy to do in XSLT 2.0:

    <xsl:template match="p">
        <para>
            <xsl:for-each-group select="node()" group-starting-with="br">
                <alinea>
                    <xsl:copy-of select="current-group()[not(self::br)]" />
                </alinea>   
            </xsl:for-each-group>
        </para>
    </xsl:template>
    

    Demo: https://xsltfiddle.liberty-development.net/6r5Gh2Q