2016-07-04 3 views
0

Как я могу заставить Saxon преобразовать строку 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); 

Этот код преобразует

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

в XdmNode, который выглядит как:

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

Это вызывает проблемы позже, когда я отправьте OuterXml на следующий шаг.

Как я могу освободить свой XdmNode?

ответ

0

Вы говорите, что код преобразует

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

в XdmNode, который выглядит как:

<stuff>&lt;blah&gt;</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> 

будет производить этот вывод при условии, что вы отправляете выход преобразования в Serializer (а не, например, к XdmNode).

+0

Кажется, что проблема связана с сериализатором, который мы используем. Если выход из преобразования использует класс Saxon * Serializer *, то строка верна. Если преобразование выводится на XdmNode, а затем сериализуется с использованием сериализатора .net * XmlWriter *, то я получаю проблему, описанную выше. – Neil

+0

Абсолютно. Вот почему disable-output-escaping устарел; это может быть сделано только для работы, если между механизмом преобразования XSLT и сериализатором существует очень тесная связь. –

+0

Итак, вы говорите, если я сериализую во время преобразования, это работает, но если я сериализую вывод позже, это не сработает? – Neil