7

次のようなコンテンツを含むドキュメントを別のドキュメントに変換しようとしています。CDATA は最初のドキュメントとまったく同じままですが、CDATA を XSLT で保持する方法がわかりません。

初期 XML:

<node>
    <subNode>
        <![CDATA[ HI THERE ]]>
    </subNode>
    <subNode>
        <![CDATA[ SOME TEXT ]]>
    </subNode>
</node>

最終的な XML:

<newDoc>
    <data>
        <text>
            <![CDATA[ HI THERE ]]>
        </text>
        <text>
            <![CDATA[ SOME TEXT ]]>
        </text>
    </data>
</newDoc>

私はこのようなことを試しましたが、運が悪く、すべてがごちゃごちゃになります:

<xsl:element name="subNode">
    <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:element>

CDATA を保存する方法はありますか?

ありがとう!ランス

ruby/のこぎりを使う

更新:これは機能するものです。

<text disable-output-escaping="yes">&lt;![CDATA[</text>
<value-of select="normalize-space(text())" disable-output-escaping="yes"/>
<text disable-output-escaping="yes">]]&gt;</text>

これにより、すべての text() ノードが CDATA でラップされます。これは、必要なもので機能し、テキスト内の html タグを保持します。

4

3 に答える 3

5

CDATA ノードがプレーン テキスト ノードと混在している場合、CDATA ノードの正確な順序を保持することはできません。せいぜい、出力内の特定の要素のすべてのコンテンツを強制的に CDATA にするには、その要素名を にリストしますxsl:output/@cdata-section-elements

<xsl:output cdata-section-elements="text"/>
于 2009-10-01T06:36:05.423 に答える
3

自分の質問への回答を投稿して申し訳ありませんが、うまくいくものを見つけました:


<text disable-output-escaping="yes">&lt;![CDATA[</text>
<value-of select="normalize-space(text())" disable-output-escaping="yes"/>
<text disable-output-escaping="yes">]]&gt;</text>

これにより、すべての text() ノードが CDATA でラップされます。これは、必要なもので機能し、テキスト内の html タグを保持します。

于 2009-10-05T08:28:33.077 に答える