2

XML ドキュメント (InstallAnywhere .iap_xml インストーラー) を処理してから、それを別のツール (InstallAnywhere 自体) に渡していくつかの値を更新しています。しかし、私が使用している XSLT 変換は、ドキュメントから CDATA セクション (InstallAnywhere にとって重要と思われるセクション) を取り除いているようです。

Ant 1.7.0、JDK 1.6.0_16、および ID に基づくスタイルシートを使用しています。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" encoding="UTF-8" cdata-section-elements="string" />
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

基本的に、次のような「文字列」ノード:

<string><![CDATA[]]></string>

に処理されています:

<string/>

XSLT FAQ を読むと、XSLT 仕様に関する限り、起こっていることが合法であることがわかります。これが発生するのを防ぎ、XSLT プロセッサに CDATA セクションを発行するよう説得する方法はありますか?

4

3 に答える 3

1

解決策を見つけました:

<xsl:template match="string">
    <xsl:element name="string">
        <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text><xsl:value-of select="text()" disable-output-escaping="yes" /><xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
    </xsl:element>
</xsl:template>

また、<xsl:output>要素からcdata-section-elements属性を削除しました。

基本的に、CDATAセクションはチェーン内の次のツールにとって重要であるため、手動で出力します。

于 2009-09-01T22:07:55.180 に答える
0

これを行うには、空のstring要素に特別なケースを追加して、を使用する必要がありますdisable-output-escaping。テストするAntのコピーはありませんが、次のテンプレートがlibxml'sxsltprocで機能しました。これは、あなたが説明したのと同じ動作を示します。

<?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" cdata-section-elements="string"/>

    <xsl:template match="string">
        <xsl:choose>
            <xsl:when test=". = ''">
                <string>
                    <xsl:text disable-output-escaping="yes"><![CDATA[]]></xsl:text>
                </string>
            </xsl:when>

            <xsl:otherwise>
                <xsl:copy-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

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

入力:

<input>
    <string><![CDATA[foo]]></string>
    <string><![CDATA[]]></string>
</input>

出力:

<input>
    <string><![CDATA[foo]]></string>
    <string><![CDATA[]]></string>
</input>
于 2009-09-01T22:04:26.077 に答える
0

XML パーサーが XML の処理を​​完了すると、 と の間にまったく違いは<![CDATA[abc]]>ありませんabc。同じことが空の文字列にも当てはまります<![CDATA[]]>。何も解決されず、黙って無視されます。XML モデルでの表現はありません。実際、CDATA と通常の文字列との違いを見分ける方法はなく、どちらも XML モデルで表現されていません。

ごめん。

さて、なぜこれが欲しいのですか?おそらく、あなたを助けることができる別の解決策がありますか?

于 2009-09-01T21:46:35.723 に答える