Разрешить XML-элемент в любом порядке с любым количеством отображений через XSD?

#xml #xsd #jaxb #xsd-validation #xml-validation

#xml #xsd #jaxb #xsd-проверка #xml-проверка

Вопрос:

У меня возникли проблемы с написанием XSD с этими ограничениями: требуется элемент Name; Элемент Value может отображаться 0 или несколько раз; Элемент Category является необязательным. Теперь у меня есть XSD, подобный этому:

 <xs:element name="Detail" maxOccurs="unbounded" minOccurs="0"> <!-- 0 or more Details -->
  <xs:complexType>
    <xs:sequence>
      <xs:element type="xs:string" name="Name"/> <!-- Name element is required -->
      <xs:element type="xs:string" name="Value" maxOccurs="unbounded" minOccurs="0"/> <!-- 0 or more occurences of Value element -->
      <xs:element type="xs:string" name="Category" minOccurs="0" maxOccurs="1"/> <!-- optional (0 or 1) Category element -->
    </xs:sequence>
  </xs:complexType>
</xs:element>
  

Проблема в том, что входной XML может не соответствовать порядку в схеме. И xs: choice и xs: все имеют ограничения на внешний вид, которые недостаточно хороши для меня.

Может ли кто-нибудь помочь мне решить эту проблему, чтобы разрешить XML-элемент в любом порядке с любым количеством отображений?

Прикрепите образец входного XML:

 <Detail>
    <Category />
    <Name> Thanks </Name>
    <Value> 1 </Value>
    <Value> 2 </Value>
</Detail>
  

Ответ №1:

XSD 1.0

Невозможно. Либо наложите порядок, либо ослабьте ограничения на вхождение.

XSD 1.1

Возможно, потому что в XSD 1.1 дочерние xs:all элементы теперь могут иметь @maxOccurs="unbounded" :

 <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
           elementFormDefault="qualified"
  vc:minVersion="1.1">
  <xs:element name="Detail"> 
    <xs:complexType>
      <xs:all>
        <xs:element type="xs:string" name="Name"/>
        <xs:element type="xs:string" name="Value" 
                    minOccurs="0" maxOccurs="unbounded" />
        <xs:element type="xs:string" name="Category" 
                    minOccurs="0" maxOccurs="1"/>
      </xs:all>
    </xs:complexType>
  </xs:element>
</xs:schema>
  

Комментарии:

1. Спасибо. Как я могу проверить версию xsd, которую я использую в настоящее время? » w3.org/2007/XMLSchema-versioning » показывает, что URI не зарегистрирован.

2. Если вы попытаетесь выполнить проверку с использованием показанного 1.1 XSD, а ваш процессор не поддерживает XSD 1.1, вы получите сообщение об ошибке, указывающее, что @maxOccurs этого может не быть unbounded .

3. К сожалению, мой процессор не поддерживает 1.1. Хотя это не решает мою проблему, все же полезно, чтобы я отказался от борьбы с xsd и обратился к другому подходу. Большое спасибо.