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">
</alinea><alinea>
</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>
我正在尝试将包含 <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">
</alinea><alinea>
</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>