Сохранить CDATA для преобразования xstl?

Я делаю преобразование xstl с saxon из XML-документа. Документ не является стандартным XML, и я хочу сохранить все найденные в нем элементы <![CDATA[<.

Однако использование файла .xsl для преобразования с помощью

Transformer trans = TransformerFactory.newInstance().newTransformer(new StreamSource(new File("foo.xsl"));
trans.transform(new StreamSource(new File("foo.xml"), new StreamResult(new File("output.xml")));

приводит к удалению этих записей CDATA. Как я могу предотвратить это?


person membersound    schedule 05.12.2012    source источник


Ответы (2)


Вы не можете, так как в модели данных, используемой xslt, нет возможности определить, был ли текст создан в разделе cdata. Однако вы можете определить в своей таблице стилей, что определенные элементы результатов должны быть заключены в cdata. Это делается с помощью атрибута cdata-section-elements элемента xsl:output в вашей таблице стилей.

person Jörn Horstmann    schedule 05.12.2012
comment
Это работает отлично! Еще один вопрос: как я могу исключить определенные элементы? Допустим, у меня есть <my:request> и <my:request name="test">, как я могу исключить запрос с именем атрибута? - person membersound; 06.12.2012
comment
@membersound: Вы имеете в виду, что my:request должен быть заключен в cdata, за исключением случаев, когда он имеет атрибут имени со значением test? Я не думаю, что это возможно, так как cdata-section-elements перечисляет только qnames элементов. - person Jörn Horstmann; 06.12.2012
comment
да все внутри <my:request/> должно быть завернуто. Все, где name=test, НЕ должно быть обернуто cdata. - person membersound; 06.12.2012

Рассмотрите возможность использования инструмента LexEv Эндрю Уэлча (полагаю, в комплекте с KernowForSaxon), который предварительно обрабатывает начальные и конечные теги CDATA во что-то другое (возможно, инструкции по обработке?), которые видны в модели данных XSLT и, следовательно, доступны для приложения.

person Michael Kay    schedule 05.12.2012