Странное поведение метода createCDATASection документа с Saxon (артефакт Maven Saxon-HE 9.4)

Я попытался использовать Saxon вместо стандартной реализации JDK (я полагаю, Xalan) для преобразования XML и Xpath. В моем коде я создаю узел CDATA, используя метод document.createCDATASection (data). Код выглядит так, как показано ниже:

    CDATASection cdata = doc.createCDATASection("data");
    Node valueNode = node.appendChild(doc.createElement("value"));
    valueNode.appendChild(cdata);

Где узел - это какой-то случайный узел в моем XML. Он отлично работает с реализацией JDK по умолчанию, и результирующий XML выглядит так:

            <node>
             <value><![CDATA[data]]></value>
            </node>

Тот же код начинает вести себя странно, если я включаю артефакт Saxon maven (обратите внимание, что это просто включение, а выбор фабрики / создание экземпляра по умолчанию, как это было раньше), и все узлы cdata обрабатываются как простые текстовые узлы, т.е. XML становится:

            <node>
             <value>data</value>
            </node>

который при извлечении вызывает проблемы, поскольку этот код специально проверяет элементы cdata, которые в более позднем случае были удалены. Я не уверен, почему это происходит (похоже, я использовал его неправильно). Я также попытался исключить артефакты Xerces из моего POM (транзитивная зависимость для Saxon), но безуспешно. Кроме того, проверено, что классы реализации для DocumentBuilderFactory и т. Д. Используются из самого JDK. Эксперты, пожалуйста, помогите мне, если я что-то делаю не так.

Заранее спасибо.


person prashant    schedule 05.06.2013    source источник


Ответы (1)


Я предполагаю, что ваше приложение, вероятно, выполняет преобразование идентификатора JAXP из DOMSource в StreamResult, чтобы сериализовать DOM. Реализация Saxon преобразования идентичности JAXP использует правила сериализации XSLT, которые имеют эффект отбрасывания разделов CDATA. Это полностью соответствует JAXP, даже если это не то, что делает реализация JDK по умолчанию.

Если вы зависите от поведения конкретной реализации преобразователя идентификаторов JAXP, вам не следует писать свое приложение, чтобы подбирать любую реализацию, которая случайно валяется в пути к классам; вы должны явно создать экземпляр нужной реализации.

Конечно, это может быть сложно, если код, вызывающий преобразование идентичности, написан не вами сам и не может быть легко изменен. В этом случае лучший подход - установить системное свойство javax.xml.transform.TransformerFactory для выбора Xalan, а если вы хотите вызвать Saxon, сделайте это явно, а не полагайтесь на поиск по фабрике JAXP.

person Michael Kay    schedule 06.06.2013
comment
Спасибо, Майкл. Решил проблему своим ответом. Большое спасибо. - person prashant; 10.06.2013