XSD-схема для рекурсивного XML - PullRequest
0 голосов
/ 22 марта 2010

У меня проблемы с созданием XSD для некоторых XML.

Немного фона может помочь. XML для обмена сообщениями. В частности, сообщение разработан, чтобы быть простым, и предназначен для перекрестных ссылок легко. В его сердце рекурсивное значение ключа

Значения простого ключа такие же.

    <key name="quantity">5</key>
    <key name="price" representation="percentage">99.78</key>

Существует необязательный атрибут представления, где информация может быть представлен в двух разных формах.

Значения ссылочного ключа такие же

    <key name="currency" reference="instrument">
        <id name=" INSID" system="XXXX" instance="PROD">DEM</id>
        <id name=" EXTERN_ID1" system="XXXX" instance="PROD"> ext128k</id>
    </key>

Эта форма используется для ссылок на внешние ключи или для ссылок на перечисления. Служба перекрестных ссылок выберет все ключи с атрибутом ссылки. Затем он получит все возможные идентификаторы для этой ссылки и добавит дополнительный идентификатор. полей и замените этот подэлемент новой версией.

т.е. "./key[@reference]" в качестве Xpath может получить все перечисления и ссылки из xml

Наконец, существует рекурсивная структура. Здесь значение части значения ключа, может быть само значение ключа.

<key name="trade" type="trade">
    <key name="value_day">1999-03-12</key>
    <key name="quantity">5</key>
    <key name="leg" type="leg">
        <key name="rate">5.00</key>
        <key name="period">3m</key>
        <key name="cashflows" type="cashflows">
            <key name="cashflow">10</key>
            <key name="cashflow">20</key>
        </key>
    </key>
</key>

Теперь у меня есть реальная проблема с созданием XSD для этой структуры.

Может кто-нибудь помочь?

Спасибо

Ник

1 Ответ

2 голосов
/ 22 марта 2010

Если я правильно понимаю, вы хотите, чтобы вы могли написать схему следующим образом:

<!-- WARNING: this is not valid Schema -->
<xs:complexType name="composite-key">
  <xs:choice maxOccurs="unbounded">
    <xs:element name="key" type="simple-key"/>
    <xs:element name="key" type="composite-key"/>
  </xs:choice>
  <xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>

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

Если у вас есть контроль над XML, вы можете сделать это, изменив одно или оба имени элемента. Например, можно использовать val для простых значений и obj для составных:

<xs:complexType name="composite-key">
  <xs:choice maxOccurs="unbounded">
    <xs:element name="val" type="simple-key"/>
    <xs:element name="obj" type="composite-key"/>
  </xs:choice>
  <xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>

Настройте имена по вкусу. Это было бы мое рекомендуемое решение, поскольку оно подчеркивает ясность. Однако имена элементов могут быть вне вашего контроля. Если это так, менее удовлетворительное решение будет следующим:

<xs:complexType name="key" mixed="true">
  <xs:sequence maxOccurs="unbounded">
    <xs:element name="key" type="key"/>
  </xs:sequence>
  <xs:attribute name="name" type="xs:string" use="required"/>
  <xs:attribute name="type" type="xs:string"/>
  <xs:attribute name="representation" type="xs:string"/>
</xs:complexType>

Ключевыми различиями здесь являются тип контента смешанный и прискорбный факт, что объявление теперь является смесью простых и составных типов ключей. Я говорю, что это «менее удовлетворительно», потому что теперь вы должны выполнить дополнительную проверку достоверности в своем собственном коде после того, как схема закончит с ним. Например, вам необходимо проверить, имеет ли смысл данный набор атрибутов для подразумеваемого типа ключа. Кроме того, приведенный пример позволит тексту появляться между вложенными ключевыми элементами - возможно, это то, что вам не нужно.

[править: тот же вопрос обсуждается в stackoverflow здесь ]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...