我们有一个遗留系统,需要的格式不是html,但足够接近令人困惑。在我们闪亮的前端网站上,我们有一个CKEditor实例,允许用户编辑这种类似于html但非真实的格式。
big 的区别在于我们的格式无法理解<p>
标记。它希望使用<br />
格式化新行。可以将CKEditor设置为在BR
模式下运行,但也许不出所料,这会导致一些烦人的用户界面错误。
作为替代方案,我正在考虑允许它以默认的P
模式运行,并用一些XSLT替换服务器上的标签。这在一个方向上很容易:
转化:
<root>
<p>Test</p><p>Test</p><p>Test</p>
<p><b>Test</b></p>
</root>
使用:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Replace `[p]contents[/p]` with `contents[br /]` -->
<xsl:template match="p">
<xsl:apply-templates/><br/>
</xsl:template>
结果:
<root>Test<br/>Test<br/>Test<br/><b>Test</b><br/></root>
问题是,我是否丢失了太多信息以反向执行相同的过程?如果没有,接近这个的最佳方法是什么? XSLT是否是正确的选择?
答案 0 :(得分:4)
怎么样:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="k1"
match="root/node()[not(self::br)]"
use="generate-id(following-sibling::br[1])"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="br" mode="wrap"/>
</xsl:copy>
</xsl:template>
<xsl:template match="br" mode="wrap">
<p>
<xsl:apply-templates select="key('k1', generate-id())"/>
</p>
</xsl:template>
</xsl:stylesheet>
使用Saxon 6.5.5转换
<root>Test<br/>Test<br/>Test<br/><b>Test</b><br/></root>
到
<root><p>Test</p><p>Test</p><p>Test</p><p><b>Test</b></p></root>