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

时间:2019-02-08 01:41:19

标签: xslt xpath xslt-2.0 line-breaks

我正在尝试将包含<p>个元素的<br/>元素转换成几个<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>

3 个答案:

答案 0 :(得分:1)

可能您可以使用以下内容:

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

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

我发现了一种(肮脏的)方式,将<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>

有什么漂亮的吗?

相关问题