XSLT:在 <p> 元素中,如何用连续的 <alinea> 元素替换换行符 (<br/>)?

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

我正在尝试将包含 <br/> 个元素的 <p> 元素转换为多个 <alinea>subtext</alinea>。例如:

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

从之前的 <p> 开始,我希望简单地将所有 <br/> 替换为 </alinea><alinea>,因为 <p> 的模板已经打开了一个 <alinea> 元素。

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

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

但它没有验证。

预期结果:

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

我找到了一种(肮脏的?)方法来将 <br> 替换为 </alinea><alinea> :

  <xsl:template match="br">
     <xsl:value-of disable-output-escaping="yes">
        &lt;/alinea&gt;&lt;alinea&gt;
     </xsl:value-of>
  </xsl:template>

还有更漂亮的吗?

可能你可以使用这样的东西:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="p">
    <para>
      <xsl:apply-templates/>
    </para>
  </xsl:template>

  <xsl:template match="text()">
    <aline>
      <xsl:value-of select="."/>
    </aline>
  </xsl:template>

  <xsl:template match="br"/>

  <xsl:template match="div">
    <blockquote>
      <xsl:value-of select="."/>
    </blockquote>
  </xsl:template>

</xsl:stylesheet>

这在 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>

演示https://xsltfiddle.liberty-development.net/6r5Gh2Q