2

html ではなく、混乱するほど近い形式を必要とするレガシー システムがあります。私たちの光沢のあるフロント エンド Web サイトには、ユーザーがこの少し HTML に似ているが実際にはそうではない形式を編集できるようにする CKEditor のインスタンスがあります。

大きな違いは、私たちのフォーマットは<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 に答える