2

概要: xslt を使用してデータを変換していますが、CDATA を含むタグと含まないタグを生成する必要があります。私の唯一のオプションは CDATA セクションをエスケープすることですか?

xml に既にあるデータをMoodle Xmlに変換してインポートしようとしています。最終製品には、 Moodle Xml docが CDATAに含める必要があると具体的に述べている Html を含める必要があります。

望ましい出力:

<question>
  <name>
    <text>FooName</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<img src="1.png">]]></text>
  </questiontext>
</question>

次のコードを使用してこれを試してみました (トリミングされていますが、入力 xml ファイルからのデータが含まれます)。

方法1、特別なことは何もありません

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="/">
    <question>
      <name>
        <text>FooName</text>
      </name>
      <questiontext format="html">
        <text><![CDATA[<img src="1.png">]]></text>
      </questiontext>
   </xsl:template>

</xsl:stylesheet>

そして得た...

方法 1 からの悪い出力

<question>
  <name>
    <text>FooName</text>
  </name>
  <questiontext format="html">
    <text>&lt;img src="1.png"&gt;</text>
  </questiontext>
</question>

だから私はxsltのドキュメントいくつかのSOの質問を調べました.2つのオプションがあると思われます:

  1. 何もしないでください。CDATA はエスケープされます。
  2. cdata-section-elements ="text"タグ内の cdata セクションを自動生成するために使用します
  3. を使用して、手動で CDATA セクションを生成します。disable-output-escaping="yes"

OK、自動生成はいいですね。それを試してみましょう:

方法 2 追加cdata-section-elements="text"

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" cdata-section-elements="text"/>

からの不正な出力cdata-section-elements ="text":

<question>
  <name>
    <text><![CDATA[FooName]]></text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<img src="1.png">]]></text>
  </questiontext>
</question>

したがって、2 はオプションではありません。これは、私が制御していないスキーマに、CDATA を含めたくない他の要素があるためです。

これにより、手でエスケープするオプション 3 が残ります。私の質問は次のとおりです。オプション 3 は私の唯一のオプションですか? XSLT を使用して目的の出力を得るために他にできることはありますか? XSLT を使用していませんか?

4

3 に答える 3

0

お気付きのように、方法 1 と方法 2 では期待どおりの結果が得られません。

出力語彙の外観に対する非常に奇妙でまれな要件のため、3 番目の方法しか残されていません。

于 2010-08-31T03:06:00.957 に答える
0

Dimitreが答えているように、XML要素の名前にはスキーマの意味があるため、要件は奇妙です。エレメント スキーマで CDATA が許可されている場合text、これはすべてのtextエレメントに適用されます。

余分な要素でやりたいことをする1つの方法:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xsl:output cdata-section-elements="xhtml:div"/>
    <xsl:template match="/">
        <question>
            <name>
                <text>FooName</text>
            </name>
            <questiontext format="html">
                <text>
                     <xhtml:div><![CDATA[<img src="1.png">]]></xhtml:div>
                </text>
            </questiontext>
        </question>
    </xsl:template>
</xsl:stylesheet>

出力 (任意の入力あり):

<question xmlns:xhtml="http://www.w3.org/1999/xhtml">
    <name>
        <text>FooName</text>
    </name>
    <questiontext format="html">
        <text>
            <xhtml:div><![CDATA[<img src="1.png">]]></xhtml:div>
        </text>
    </questiontext>
</question>
于 2010-08-31T14:40:49.440 に答える