2017-12-08 11 views
0

私はそのUTFに変え転換していたときに私のXMLでは、いくつかのヘキサ小数実体がある - 8進数のエンティティが変更されている

INPUTファイル:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <a>a text.</a> 
    <b>b &#x2013; text.</b> 
</root> 

マイXSLTを:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> 

    <xsl:output method="xml"/> 

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

</xsl:stylesheet> 

CURRENT OUTPUT:

<root> 
    <a>a text.</a> 
    <b>b – text.</b> 
</root> 

所望の出力:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <a>a text.</a> 
    <b>b &#x2013; text.</b> 
</root> 
+1

エンコードをUTF-8として使用すると、なぜユニコード文字が問題になるのですか? XSLTプロセッサは、XMLパーサを使用して、入力をUnicode文字を含むテキストノードを持つツリーに構文解析します。元の入力ドキュメントに文字参照または文字が含まれているかどうかはわかりませんので、文字参照を保持できません。 XSLT 2以降では、特定の文字を異なる出力文字列表現にマップする文字マップを定義しています。その結果、結果ツリーのダッシュが文字参照としてシリアル化されるように定義できます。 –

+0

https://www.w3.org/TR/xslt20/#character-maps –

答えて

2

さまざまな手法が要件を満たしている場合としない場合があるため、必要な理由を知ることは役に立ちます。

1つのアプローチは、出力エンコードとしてUS-ASCIIを指定することです。その後、すべてのASCII以外の文字は数値エンティティ(文字参照)として出力に表示されます。残念ながら、これは要素名や属性名にASCII以外の文字を使用できないことを意味します。

+0

ありがとう、私のための@Michealその仕事は今。クライアントの要件として、私はXMLを受け取り、それをHTML、In-design、およびXMLに変換しますが、XMLの変換後にすべてのエンティティが上記のように変更され、クライアントが処理後に要求したXMLはINPUT XMLと正確に一致する必要があります。それ。それでもコード「フラン&#x00E7; ois」、出力は「フランç ois」と表示されます。もう一度ありがとう –

+0

XSLTではあなたの入力と正確に一致することはできません: '%'で書かれたパーセント記号と '%'で書かれた記号を区別する方法はありません。それはまた不条理な要件です:時々あなたはあなたが彼らよりも技術をよく理解していることをクライアントに伝えなければなりません。 –

1

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> 

    <xsl:output method="xml" use-character-maps="entity"/> 

    <xsl:character-map name="entity"> 
     <xsl:output-character character="&#x2013;" string="&amp;#x2013;"/> 
    </xsl:character-map> 

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

</xsl:stylesheet> 

出力

<?xml version="1.0" encoding="UTF-8"?> 
    <root> 
     <a>a text.</a> 
     <b>b &#x2013; text.</b> 
    </root> 
としてスクリプトに文字マップを追加します。

プロセスを参照してくださいhttp://xsltransform.hikmatu.com/6qM2e2b

+0

をご覧ください。返信いただきありがとうございます。実際に私はエンティティのリストは便利ではないため、私たちのスクリプトはオンラインアプリケーションを実行するため、別の代替物を探しています。もう一度ありがとうございます。 –

+0

@Amrendra、私はこのタイプのシナリオでは、すべての入力をから& ..に変換する入力用のプリプロセッサを作成する必要があると思います。それはあなたの問題を解決します – Rupesh

関連する問題