0

次のマッピングを実行する必要があります。(単純な) 整形式の XML ファイルを受け取ります。そのxmlファイルには、エンコードされた特殊文字が含まれる場合があります。例えば ​​&

マッピングの出力は次のようになる必要があります。

<ns0:SupplierTransaction xmlns:ns0="http://MH.Schemas/SQL/MDM/Supplier">
  <ns0:CIC.ImportSupplier_Spain>
    <ns0:data>&lt;Suppliers xmlns=""&gt;&lt;Supplier&gt;&lt;IDCONO&gt;All Freez &amp;lt; &amp;amp; &amp;gt; (Verp)IZ Oude Bunders&lt;/IDCONO&gt;&lt;/Supplier&gt;&lt;/Suppliers&gt;</ns0:data>
   </ns0:CIC.ImportSupplier_Spain>
 </ns0:SupplierTransaction>

ご覧のとおり、受信した xml をエンコードして、いくつかのノードにラップする必要があります。問題は、特殊文字 (&、<、>) の場合、それらを 2 回エンコードする必要があることです。ns0:data フィールドを解析して XML に戻すと、「&」も解析されるためです。「&」に戻り、無効な XML になります。& に解析する必要があります。==> そのため、2 回エンコードする必要があります。

私の質問は、どうすれば xsl でこれを達成できますか? したがって、特殊記号を検出する必要があります。

"&" and encode it twice: &amp;amp;
"<" and encode it twice: &amp;lt;
">" and encode it twice: &amp;gt;

参考までに、このメッセージを SQL プロシージャに送信しています。SQL プロシージャーの入力パラメーターは「data」と呼ばれ、データ型は「XML」です。そのため、SQL はデータ要素内にあるすべてのものを XML に解析し、特殊文字を二重にエンコードしないと、特殊文字でエラーをスローします。例えば:

<ns0:data>&lt;Node&gt;This is some text &amp; chars&lt;/Node&gt;</ns0:data>

したがって、これは次のように解析されます。

<Node>This is some tekst & chars</Node> ==> Invalid XML

次のようにする必要があります。

<ns0:data>&lt;Node&gt;This is some text &amp;amp; chars&lt;/Node&gt;</ns0:data>

次のように解析されます。

<Node>This is some tekst &amp; chars</Node> ==> Valid XML
4

1 に答える 1

1

XSLT は元の入力をテキストの文字列としてではなく、ノードのツリーとして認識するため、これは実際には XSLT の仕事ではありません。(非常に複雑な) テンプレートを使用して、入力ドキュメントを手動で再シリアル化する必要があります。

元の XML を文字列として持っている場合は、それを解析して XML として処理するのではなく、使用している言語で XML 書き込み API を使用して、次を含む XML ドキュメントを書き出すことをお勧めします。要素の文字コンテンツとして XML データの元の文字列を取得しns0:data、必要なすべてのエスケープを XML シリアライザーに処理させます。Java の例は次のようになります。

XMLOutputFactory xof = XMLOutputFactory.newFactory();
XMLStreamWriter writer = xof.createXMLStreamWriter(outputStream, "UTF-8");
writer.writeStartDocument();
String uri = "http://MH.Schemas/SQL/MDM/Supplier";
writer.writeStartElement("ns0", "SupplierTransaction", uri);
writer.writeStartElement("ns0", "CIC.ImportSupplier_Spain", uri);
writer.writeStartElement("ns0", "data", uri);
writer.writeCharacters(originalXMLString);
writer.writeEndDocument();
writer.close();
outputStream.close();

ただし、同等の動作はどの言語でも簡単に実装できるはずです。

于 2013-06-10T16:20:19.747 に答える