2014-10-20 3 views
0

Мы создаем инструмент XQuery для создания документации для схем XSD (в частности, схем UBL 2.1).Упростите схему XSD с помощью XQuery

Для этого нам необходимо упростить схемы, основанные на широком использовании ссылок на элементы и сложных типов, чтобы быть встроенными определениями.

Так элемент, как это:

<xsd:element name="Order" type="OrderType"/> 
    <xsd:complexType name="OrderType"> 
     <xsd:sequence> 
     ... 
     <xsd:element ref="cbc:UBLVersionID" minOccurs="0" maxOccurs="1"/> 
     ... 
     </xsd:sequence> 
    </xsd:complexType> 
    ... 
    (in another file) 
    <xsd:element name="UBLVersionID" type="UBLVersionIDType"/> 
    <xsd:complexType name="UBLVersionIDType"> 
     <xsd:simpleContent> 
     <xsd:extension base="xsd:string"/> 
     </xsd:simpleContent> 
    </xsd:complexType> 

должны быть преобразованы в:

<xsd:element name="Order"> 
     <xsd:complexType> 
     <xsd:sequence> 
      ... 
      <xsd:element ref="cbc:UBLVersionID" minOccurs="0" maxOccurs="1"> 
       <xsd:complexType name="UBLVersionIDType"> 
       <xsd:simpleContent> 
        <xsd:extension base="xsd:string"/> 
       </xsd:simpleContent> 
      </xsd:complexType> 
      ... 
     </xsd:sequence> 
     </xsd:complexType> </xsd:element> 

Принимая во внимание, что некоторые элементы и типы определены в импортных схемах.

Есть ли известный способ получить это с помощью XQuery?

Спасибо.

+0

Помните что отображаемая вами целевая форма не является юридическим документом схемы XSD. Если единственным поставщиком продукции является ваше программное обеспечение для документации, это не будет проблемой. Но если вы хотите использовать встроенную («упрощенную»? Не совсем) форму для проверки (хотя бы для тестирования, чтобы убедиться, что она принимает и отклоняет те же документы, что и оригинал), эти атрибуты ref должны быть изменены на ' name ". (Хм, но учитывая присутствие импорта, вы не можете определить схему в одном документе схемы (xsd: элемент схемы) в любом случае. Поэтому, возможно, это не проблема.) –

+0

Вы правы. Я заинтересован в преобразовании набора файлов схемы (в данном случае UBL) в один файл, полностью встроенный. –

ответ

1

Возможно, вам будет полезно обработать схемы в формате SCM Saxon, который представляет собой XML-представление компонентов схемы XSD в нормализованной форме. Вы можете сгенерировать эту форму, используя

java com.saxonica.Validate -xsd:schema.xsd -scmout:schema.scm 

Документация для формата SCM - это в основном документация компонентов схемы в спецификации W3C.

Формат делает противоположное тому, что вы просите: все компоненты «вне линии», доступ к которым осуществляется по следующим ссылкам. Но он очень унифицирован и позволяет избежать всех сложностей управления, импорта, пространств имен и QNames.

+1

Любой шанс увидеть его на Саксоне-ОН? (Только до того, как моя копилка получит достаточно денег, чтобы купить полный саксон) ;-) –

+0

Saxon-HE не включает в себя возможности обработки схем. Извините, если вы не можете себе это позволить; мы стараемся сделать цену доступной, при этом принося достаточный доход для финансирования разработки как коммерческих, так и продуктов с открытым исходным кодом, но всегда найдутся люди, которые хотят использовать эту функцию, но не могут оправдать затраты. –

0

Я не знаю «известного метода», по которому я предполагаю, что вы имеете в виду что-то из коробки или заранее построено.

Вам действительно нужно написать настраиваемое преобразование, которое вы могли бы сделать либо в XQuery, либо в XSLT. В XQuery это в основном рекурсивный спуск, и вы можете найти примеры здесь: https://en.wikibooks.org/wiki/XQuery/Transformation_idioms

Однако, как указывает @ michael-kay, вам также нужно написать код для обработки импорта и его включения. Поэтому, возможно, предварительная обработка в формате SCM (прежде чем вы сделаете свою инкрустацию) - это хорошая идея, конечно же вам также понадобится написать преобразование, чтобы перейти от SCM обратно к схеме ...

+0

Это подход, который я использовал, но у меня проблемы с бесконечной рекурсией. Есть ли у вас хороший отладчик XQuery? –

+0

Если вы используете Saxon, тогда есть довольно приличный отладчик, встроенный в Oxygen IDE. – adamretter

+0

Взгляните на функцию parse-level() в xsd2json.xqy в проекте по адресу https://github.com/lcahlander/xsd2json.git. Он справляется с проблемой бесконечной рекурсии. –

Смежные вопросы