0

次のようなXMLファイルがあります

<?xml version="1.0" encoding="UTF-8"?>
<domData CHECK_STATE="P">
  <K>
    <![CDATA[F]]>
  </K>
  <P>
    <![CDATA[F]]>
  </P
  <L>
    <![CDATA[F
    CC
    DD
    GEJ]]>
  </L>
  <D/>
  <E/>
  <A>TEST</A>
  <B>
  <![CDATA[<root><iA>DATA</iA><iB>DDDD</iB><</root>]]>
  </B>
</domData>

そして私は次のような変化を遂げました

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="@*">
                <xsl:sort select="name()"/>
            </xsl:apply-templates>

            <xsl:apply-templates select="node()">
                <xsl:sort select="name()">
                </xsl:sort>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

上記の変換により、すべてのCDATAが削除され、内部のxmlエンティティがエスケープされます。

要素の数が膨大で、異なるXMLファイルにも同じxsltを使用したいので、「cdata-section-elements」を使用できません。

私の問題は、CDATAタグと内部xmlをそのままにしておく必要があることです。出来ますか?どうも

4

2 に答える 2

0

要素の数が膨大で、異なるXMLファイルにも同じxsltを使用したいので、「cdata-section-elements」を使用できません。

cdata-section-elementsXSLT出力CDATAセクションを作成する唯一の標準的な方法です。どのテキストノードが元々CDATAセクションであり、どのテキストノードがプレーンテキストノードであったかに関する情報はXPathデータモデルでは利用できないため、入力ドキュメントにあるとおりにCDATAセクションを正確に保持することは確かに不可能です。ただし、CDATAセクションは構文上の糖衣にすぎず、XMLプロセッサに関する限り、エンティティエスケープ形式とまったく同じであるため、必要ありません。

使用できるプロセッサ固有のトリックがあるかもしれませんが、それは使用するXSLTプロセッサによって異なります。元のCDATA構造を保持するように構成できるDOMなどのオブジェクトモデルを使用して、非XSLTソリューションを検討することをお勧めします。

于 2013-02-27T11:54:50.627 に答える
0

CDATA タグが情報を伝達する場合は、XSLT が認識してデータ モデルに保持できる別のものに置き換えることから始めます。XSLT 処理の入力側で SAX フィルター パスを使用してこれを行うことができ、出力側で同様のフィルター パスで要素を CDATA タグに戻すことができます。

ただし、情報を運ぶために CDATA セクションの境界を使用する人は誰でも撃たれるべきです。

于 2013-02-27T16:41:47.930 に答える