У меня есть программа Java, которая обрабатывает файлы xml. Эти файлы в формате S1000D используются для технической документации. Мне нужно обновить некоторые метаданные в файлах xml, и я использую для этого SAXON.
Но Saxon делает больше преобразований, чем в моем xsl.
Вот выдержка из одного из моих входных файлов:
<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.
Vestibulum pulvinar sapien at lacus lacinia,
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.
В Саксонии мы пробовали:
Я также изучил BaseX, но проблема та же, и я недостаточно разбираюсь в этой библиотеке, чтобы выяснить, возможно ли добиться такого поведения.
Любая помощь будет оценена!
В зависимости от используемого вами API могут быть способы повлиять на сериализацию дерева результатов и, например. убедитесь, что пустые элементы сериализованы, например. <foo></foo>
вместо <foo/>
, но тогда выполняется сериализация вывода, а не сохранение деталей входной разметки. И такие детали часто требуют добавления кода Java или .NET для настройки этой детали сериализации.
Я вижу, нет простого способа добиться этого. Может быть, нам нужно добиться преобразования с помощью регулярных выражений? ха-ха
Интересно, какое программное обеспечение редактора делает для представления XML или других форматов и позволяет вам манипулировать его частями, я думаю, у них также есть древовидные представления, но, вероятно, с более подробной информацией, чем стандартная древовидная модель DOM или XDM. Поэтому может иметь смысл использовать API и структуры данных, которые редактор использует для представления XML и управления им, если вам нужно сохранить такие детали.
Я работаю на производителя самолетов, и мы редактируем техническую документацию самолетов. Это делается в соответствии со стандартом под названием S1000D. Наши программные компоненты являются частью интеграции этой документации и получают ее от различных других организаций/служб. Нам нужно обновить некоторые метаданные внутри структуры данных, но не реальное их содержание, описывающее технические вещи, потому что этот документ сертифицирован авиационными властями.
Я уже знал, что этого почти невозможно достичь, но хотел убедиться, что это так. А с вашими отзывами и ответом @michael-kay у меня есть лучшие аргументы, чтобы изменить мнение наших держателей стеков и найти более подходящее решение для их нужд.
Такие различия, как разница между <foo/>
и <foo></foo>
, теряются к моменту анализа данных (аналогично использование одинарных и двойных кавычек вокруг атрибутов, пробелов в начальных и конечных тегах и т. д.), а синтаксические анализаторы XML не предоставляют никаких данных. способ отключения расширения ссылок на сущности. Поскольку XSLT работает с выходными данными синтаксического анализатора XML, если XSLT-процессор не видит таких различий, он не может их сохранить.
Сохранение ссылок на объекты неповрежденными является вполне разумным требованием, и мой обычный обходной путь — использовать текстовый редактор для глобальной замены &
на §
(конечно, предварительно проверив, что §
не появляется в файле), а затем отменить процесс по завершении .
Сохранение точной лексической формы начального и конечного тегов является гораздо более сомнительным требованием. Если вас просят сделать это, то требование исходит от кого-то, кто не понимает XML. Saxon дает вам большой контроль над сериализацией вывода (например, параметр сериализации saxon:canonical="yes" предотвращает использование тегов пустых элементов в результате), но он не позволяет вам сохранить все, что было в вход. Если вам говорят, что это требование, то вам нужно спросить «почему» и «сколько вы готовы заплатить за это» — это значительно увеличит ваши расходы, потому что вы можете забыть обо всей готовой обработке XML. библиотеки.
XSLT использует синтаксический анализатор XML для анализа входной разметки XML в представление дерева Xdm, которое не сохраняет никаких лексических деталей, таких как
<foo/>
и<foo></foo>
, или того, был ли символ представлен в определенной кодировке или как ссылка на символ или сущность. Непонятно, для чего вы используете XSLT, но как это работает, ни один процессор XSLT не сохранит разметку на входе, она анализируется в дерево, это дерево преобразуется в дерево результатов, которое при необходимости сериализуется обратно в разметку. Таким образом, не будет возможности сохранить детали разметки, которые вы хотите сохранить.