2017-05-03 20 views
0

私はlibxslt(xsltprocコマンド)を使用してXML文書を別のXMLに変換しています。XSLT 1.0数値参照を使用してXMLエスケープ文字を出力する

出力でXMLエスケープ文字の数値参照を使用するようにlibxsltに簡単な方法があるかどうかは疑問です(&の場合は&など)。 出力を消費するアプリケーションが定義済みのエンティティ(&)を理解していないが、数値の文字参照を理解しているからです。

これを達成するための複雑な方法がいくつかあると私は理解していますが、単純なスタイルシートの指示やコマンドラインオプションがないと思っています。そうでない場合は、消費アプリケーションを変更する方が意味があります。

は、例を挙げると、入力XMLは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?> 
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <B>&lt; &gt; &quot; &amp; &apos;</B> 
    <B>&#60; &#62; &#34; &#38; &#39;</B> 
</A> 

XSLは次のとおりです。

<?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" encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*" /> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="/A/B" /> 
    </xsl:template> 

    <xsl:template match="B"> 
    <X><xsl:attribute name="ATTR"><xsl:value-of select="." /></xsl:attribute></X> 
    <xsl:text>&#x0A;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

結果は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?> 
<X ATTR="&lt; &gt; &quot; &amp; '"/> 
<X ATTR="&lt; &gt; &quot; &amp; '"/> 

私が希望した後だ結果be:

<?xml version="1.0" encoding="UTF-8"?> 
<X ATTR="&#60; &#62; &#34; &#38; '"/> 
<X ATTR="&#60; &#62; &#34; &#38; '"/> 

私はスタイルシートの前に、次を追加してみました:

<!DOCTYPE xsl:stylesheet [ 
    <!ENTITY amp "&#38;"> 
]> 

または

<!ENTITY amp "&#38;#38;"> 

をしかし、それは動作しませんでした(すなわち、結果はエンティティ定義の有無にかかわらず同じです)。

character-mapは、XSLT 1.0では使用できないため、オプションではないことも理解できます。

答えて

0

XMLのような標準は、誰もが遵守すれば膨大なコスト削減をもたらします。また、標準の変更されたバージョンまたは制限付きバージョンまたは拡張バージョンを使用しようとすると、いずれのメリットも得られません。したがって、可能な場合は、送信アプリケーションを変更して限定されたサブセットを生成するのではなく、受け取るアプリケーションを変更して正当なXMLを受け入れるようにする必要があります。

受信アプリケーションで&amp;が受け入れられない場合は、標準のXMLパーサーではなく、何らかの自家製パーサーを使用している可能性があります。これは、おそらく他の不要な制限もたくさんあることを意味しますアプリケーションの存続期間にわたって

関連する問題