Как мне написать схему для проверки элемента с тем же именем, имеющего разное содержимое? - PullRequest
0 голосов
/ 27 апреля 2018

Как мне написать схему (XSD1.0) для проверки элемента с одинаковым именем, имеющего разное содержимое? (Возможно ли это? Похоже, что первоначальное расследование нарушает «последовательность декларации элемента», но я могу ошибаться в этом.)

Фрагменты ниже иллюстрируют то, что мне нужно - по сути, у меня может быть вхождение «ParentTag» (которое глубоко вложено в мой документ), и оно может содержать любое из содержимого, определенного в 3 вариантах ниже. Я должен отметить, что «ParentTag» виден только один раз под элементом-предком, поэтому в определенной ветви дерева встречается только один вариант.

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

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

Вариант 1:

<ParentTag>
    <!-- '<value>' can repeat -->
    <value>some value</value>  <!--(type="xsd:string" minOccurs="1" maxOccurs="unbounded")-->
</ParentTag>

Вариант 2:

<ParentTag>
    <!-- Note: order of subelements not guaranteed: 'all', not 'sequence' -->
    <minValue>v1</minValue>   <!--(type="xsd:int" minOccurs="1" maxOccurs="1")-->
    <maxValue>v2</maxValue>   <!--(type="xsd:int" minOccurs="1" maxOccurs="1")-->
</ParentTag>

Вариант 3:

<ParentTag>
    <specialValue>special value</specialValue> <!--(type="xsd:string" minOccurs="1" maxOccurs="1")-->
</ParentTag>

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вы говорите: «В одной ветви дерева встречается только один вариант».

Возможно иметь разные модели содержимого для ParentTag, если разные типы ParentTag появляются в разных контекстах. Например:

<xs:element name="Customer">
  <xs:complexType>
    <xs:sequence>
       <xs:element name="Address">
          <xs:complexType>
             <xs:element name="Street" type="xs:string"/>
             <xs:element name="City" type="xs:string"/>
          </xs:complexType>
       </xs:element>
   </xs:sequence>
 </xs:complexType>
</xs:element>

<xs:element name="Supplier">
  <xs:complexType>
    <xs:sequence>
       <xs:element name="Address">
          <xs:complexType>
             <xs:element name="Road" type="xs:string"/>
             <xs:element name="Town" type="xs:string"/>
          </xs:complexType>
       </xs:element>
   </xs:sequence>
 </xs:complexType>
</xs:element>

Таким образом, адрес поставщика отличается от адреса клиента.

Обычно различия более тонкие, чем это: например, в схеме для представления XML JSON в спецификации XPath 3.1, <array>, содержащийся в <map>, имеет модель содержимого, немного отличающуюся от <array> появляются где-то еще.

0 голосов
/ 27 апреля 2018

Нет, в XSD 1.0 для разных моделей контента требуются разные имена элементов 1 . Это не так обременительно для требования, как одни и те же имена действительно должны подразумевать одинаковость.

XSD 1.1 позволяет типу варьироваться в зависимости от значений атрибута ( Условное присвоение типа ). XSD 1.1 также имеет утверждения, которые обеспечивают дополнительную гибкость спецификации типа.

Учитывая, что вы сказали, что застряли в этом (плохом) дизайне XML, ваши возможности ограничены и неудовлетворительны. Если вы не хотите использовать маршрут xsd:any, вы можете использовать xs:choice и указать каждую возможную модель содержимого таким образом.

1. Исключения: одни и те же локальные имена, различающиеся через пространства имен или одни и те же имена, различаемые через иерархическое наследие (как упоминает Майкл Кей ), могут иметь разные модели контента.

...