2

我们有一个遗留系统,它需要一种不是 html 但足够接近以至于令人困惑的格式。在我们闪亮的前端网站上,我们有一个 CKEditor 实例,它允许用户编辑这种有点像 html-but-not-really 的格式。

最大的不同是我们的格式不理解<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 甚至是正确的选择吗?

4

1 回答 1

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>
于 2012-07-02T11:47:57.233 回答