2010-03-22 2 views
0

У меня возникли проблемы с созданием XSD для некоторого xml.Схема 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> 

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

т.е. «./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 для этой структуры.

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

Благодаря

Ник

+0

ли первые два XML-фрагменты имеют какое-либо отношение к вашей проблеме, или третью рекурсивную структуру? –

+0

Если я перефразирую его как объект иерархии, я получу это. KeyValue SimpleKeyValue наследует KeyValue ReferenceKeyValue наследует KeyValue ListKeyValue наследует KeyValue Ник – Nickle

ответ

2

Если я правильно понимаю, вы хотите, чтобы вы могли писать схемы, как это:

<!-- 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, вы можете сделать это, изменив один или оба имени элемента. Например, можно было бы использовать Вэл для простых значений и 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> 

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

[править: тот же вопрос обсуждается на StackOverflow here]

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