Предотвратить разрешение объектов html при обработке xsl

У меня есть программа Java, которая обрабатывает файлы xml. Эти файлы в формате S1000D используются для технической документации. Мне нужно обновить некоторые метаданные в файлах xml, и я использую для этого SAXON.

Но Saxon делает больше преобразований, чем в моем xsl.

  • Он автоматически закрывает пустые теги
  • он интерпретирует объекты HTML, содержащиеся в файле.

Вот выдержка из одного из моих входных файлов:

<dmodule xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "http://www.s1000d.org/S1000D_4-1/xml_schema_flat/schedul.xsd">
...
    <reqSpares>
        <noSpares></noSpares>
    </reqSpares>
    <reqSafety>
        <noSafety></noSafety>
    </reqSafety>
...
    <timeLimit>
        <remarks>
            <simplePara>Lorem ipsum</simplePara>
            <simplePara>Lorem ipsum dolor sit amet, consectetur adipiscing elit.&#xA;Vestibulum pulvinar sapien at lacus lacinia,&#xA;eu maximus arcu vestibulum.</simplePara>
        </remarks>
    </timeLimit>
...

И вот результат моего преображения:

<dmodule xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "http://www.s1000d.org/S1000D_4-1/xml_schema_flat/schedul.xsd">
...
    <reqSpares>
        <noSpares/>
    </reqSpares>
    <reqSafety>
        <noSafety/>
    </reqSafety>
...
    <timeLimit>
        <remarks>
            <simplePara>Lorem ipsum</simplePara>
            <simplePara>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Vestibulum pulvinar sapien at lacus lacinia,
eu maximus arcu vestibulum.</simplePara>
        </remarks>
    </timeLimit>
...

Даже если мой xsl ничего не преобразует в этих строках, они преобразуются именно так.

Мои требования заключаются в том, что у меня нет разрешения изменять по какой-либо причине структуру или содержимое XML-файла, который я преобразую, как это сделано в этом примере. Служба, предоставляющая ввод, не хочет редактировать ввод и добавлять объявление объекта в начале файла xml или инкапсулировать объекты html внутри тега CDATA.

В Саксонии мы пробовали:

  • изменить кодировку на US-ASCII
  • заменить и перевести методы, но поскольку это не на наших преобразованных узлах, это не работает
  • disable-encoding, но, как и выше, изменения не вносятся в наши преобразования xsl.

Я также изучил BaseX, но проблема та же, и я недостаточно разбираюсь в этой библиотеке, чтобы выяснить, возможно ли добиться такого поведения.

Любая помощь будет оценена!

XSLT использует синтаксический анализатор XML для анализа входной разметки XML в представление дерева Xdm, которое не сохраняет никаких лексических деталей, таких как <foo/> и <foo></foo>, или того, был ли символ представлен в определенной кодировке или как ссылка на символ или сущность. Непонятно, для чего вы используете XSLT, но как это работает, ни один процессор XSLT не сохранит разметку на входе, она анализируется в дерево, это дерево преобразуется в дерево результатов, которое при необходимости сериализуется обратно в разметку. Таким образом, не будет возможности сохранить детали разметки, которые вы хотите сохранить.

Martin Honnen 14.12.2020 17:39

В зависимости от используемого вами API могут быть способы повлиять на сериализацию дерева результатов и, например. убедитесь, что пустые элементы сериализованы, например. <foo></foo> вместо <foo/>, но тогда выполняется сериализация вывода, а не сохранение деталей входной разметки. И такие детали часто требуют добавления кода Java или .NET для настройки этой детали сериализации.

Martin Honnen 14.12.2020 17:43

Я вижу, нет простого способа добиться этого. Может быть, нам нужно добиться преобразования с помощью регулярных выражений? ха-ха

Damounet 14.12.2020 17:50
stackoverflow.com/a/1732454
michael.hor257k 14.12.2020 19:37

Интересно, какое программное обеспечение редактора делает для представления XML или других форматов и позволяет вам манипулировать его частями, я думаю, у них также есть древовидные представления, но, вероятно, с более подробной информацией, чем стандартная древовидная модель DOM или XDM. Поэтому может иметь смысл использовать API и структуры данных, которые редактор использует для представления XML и управления им, если вам нужно сохранить такие детали.

Martin Honnen 14.12.2020 21:23

Я работаю на производителя самолетов, и мы редактируем техническую документацию самолетов. Это делается в соответствии со стандартом под названием S1000D. Наши программные компоненты являются частью интеграции этой документации и получают ее от различных других организаций/служб. Нам нужно обновить некоторые метаданные внутри структуры данных, но не реальное их содержание, описывающее технические вещи, потому что этот документ сертифицирован авиационными властями.

Damounet 15.12.2020 08:48

Я уже знал, что этого почти невозможно достичь, но хотел убедиться, что это так. А с вашими отзывами и ответом @michael-kay у меня есть лучшие аргументы, чтобы изменить мнение наших держателей стеков и найти более подходящее решение для их нужд.

Damounet 15.12.2020 08:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
155
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Такие различия, как разница между <foo/> и <foo></foo>, теряются к моменту анализа данных (аналогично использование одинарных и двойных кавычек вокруг атрибутов, пробелов в начальных и конечных тегах и т. д.), а синтаксические анализаторы XML не предоставляют никаких данных. способ отключения расширения ссылок на сущности. Поскольку XSLT работает с выходными данными синтаксического анализатора XML, если XSLT-процессор не видит таких различий, он не может их сохранить.

Сохранение ссылок на объекты неповрежденными является вполне разумным требованием, и мой обычный обходной путь — использовать текстовый редактор для глобальной замены & на § (конечно, предварительно проверив, что § не появляется в файле), а затем отменить процесс по завершении .

Сохранение точной лексической формы начального и конечного тегов является гораздо более сомнительным требованием. Если вас просят сделать это, то требование исходит от кого-то, кто не понимает XML. Saxon дает вам большой контроль над сериализацией вывода (например, параметр сериализации saxon:canonical="yes" предотвращает использование тегов пустых элементов в результате), но он не позволяет вам сохранить все, что было в вход. Если вам говорят, что это требование, то вам нужно спросить «почему» и «сколько вы готовы заплатить за это» — это значительно увеличит ваши расходы, потому что вы можете забыть обо всей готовой обработке XML. библиотеки.

Другие вопросы по теме