Схема XML: замена импорта соответствующей схемой
У меня есть XML-схема, которая содержит несколько импортов, которые в свою очередь содержат импорт. Мне нужно сгенерировать семантически равную схему, где весь импорт встроен. Я хочу заменить это:
<xs:import namespace="http://some.name/" schemaLocation="./path/to/it.xsd"/>
с содержанием ссылочных схем. И мне нужно получить вывод в виде строки, а не в виде внутреннего представления.
Я попробовал Apache Xerces, но не нашел способа записать XSModel в строку. Есть?
Я попробовал Apache XmlSchema 2, но когда он пишет XML-схему, он не заменяет объявления импорта схемой.
Есть ли библиотека, которая может это сделать? Какие-либо предложения?
Благодарю.
2 ответа
xsd:include обычно может быть встроенным, а xsd:import - нет. Это потому, что xsd:import используется для ссылки на документ схемы для другого целевого пространства имен, и в одном и том же документе схемы не может быть компонентов с разными целевыми пространствами имен.
Как указано здесь и здесь, ограничение XSD наличием одного целевого пространства имен на файл делает ваш "семантически эквивалентный" запрос невозможным для решения. Это верно, а также типично во всех сценариях, где само пространство имен используется для определения границ (или уточнения) семантических наборов.
В случае рефакторинга одно время или время проектирования, когда вам не нужно программно иметь дело с такой вещью периодически или динамически, вы можете также попытаться взглянуть здесь; Возможно, проблема в вашем случае не в том, что импорт не поддерживается (что я нахожу странным), а в том, что сложность включения / импорта делает график слишком сложным для ваших инструментов. Как показано в последнем посте, проблема была решена путем свертывания включений с чистым эффектом сокращения числа необходимых импортов.
В качестве альтернативы, если каким-то образом ваша "семантическая эквивалентность" не включает пространства имен (например, я видел людей, которые были весьма заинтересованы в разработке реляционной модели из XSD), возможно, с помощью рефакторинга можно объединить все пространства имен в одно (или нет, т. е. нет целевого пространства имен), а затем введите его в свой инструмент. Единственный улов здесь, с точки зрения автоматического рефакторинга, состоит в том, чтобы гарантировать отсутствие дублированных именованных компонентов XSD в разных пространствах имен; Например, не может иметь одно и то же имя для элемента, или типа, или атрибута, или группы и т. д. в разных пространствах имен.