2016-07-04 14 views
0

< &>をエスケープせずにCDATA文字列をXdmNodeに変換するにはどうすればよいですか?ここでSaxonでエスケープされていないCDATAセクションを出力する方法

は私の 'ToXdmNode' 関数です:

 Processor processor = xxx.GetProcessor(); 
     var builder = processor.NewDocumentBuilder(); 

     builder.BaseUri = xxx.BaseUri; 
     var tr = new StringReader("<stuff><![CDATA[<blah>]]></stuff>"); 
     var node = builder.Build(tr); 

このコードは次のように見えますXdmNodeに

<stuff><![CDATA[<blah>]]></stuff> 

変換します。これは後でとき、私に問題が発生し

<stuff>&lt;blah&gt;</stuff> 

をOuterXmlを次のステップに送ります。

XdmNodeをエスケープ解除するにはどうすればよいですか?

<stuff>&lt;blah&gt;</stuff> 

が、実際には変換しません:

答えて

0

あなたは、コードがどのように見えるXdmNodeに

<stuff><![CDATA[<blah>]]></stuff> 

を変換言う二つのことは、同じ内容の異なるだけシリアル化されています。

あなたは非整形式の文字列

<stuff><blah></stuff> 

を作成したい場合は、それは、XSLTを使用してトリッキーだ、XMLされていないので、これは任意の有効なXDMノードのシリアライズではありません。しかし、あなたはdisable-output-escapingの助けを借りてそれを考案することができます。例えば、変換

<xsl:template match="stuff"> 
    <xsl:copy> 
    <xsl:value-of select="." disable-output-escaping="yes"/> 
    </xsl:copy> 
</xsl:template> 

は、あなたが(とない、例えば、XdmNodeに)シリアライザへの変換出力を送信することを提供し、この出力を生成します。

+0

私たちが使用しているシリアライザに問題があるようです。トランスフォームの出力がSaxon * Serializer *クラスを使用する場合、文字列は正しいです。トランスフォームがXdmNodeに出力され、続いて.net * XmlWriter *シリアライザを使用してシリアライズされると、上記の問題が発生します。 – Neil

+0

絶対に。そのため、ディセーブル出力のエスケープは廃止されました。 XSLT変換エンジンとシリアライザが非常に密接に結合している場合にのみ動作するようにすることができます。 –

+0

だから、あなたが言っているのは、私が変換中にシリアル化しても動作しますが、後で出力をシリアル化すれば動作しません。 – Neil

関連する問題