2013-06-06 2 views
0

несколько лет назад я определил XSD для моего файла установки XML. Цель состояла в том, чтобы определить узел требований с подузлами с разными названиями, такими как:xs: choice - один и только один из следующих узлов или один или несколько из следующих узлов?

<requirements> 
    <core version="1.0.0.1749" /> 
    <field version="1.2">chbxgroup</field> 
    <php version="5.3"/> 
</requirements> 

XSD для этой части выглядит следующим образом:

<xs:element name="requirements" minOccurs="0" maxOccurs="unbounded"> 
    <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
      <xs:element name="core" type="requirement" minOccurs="0" maxOccurs="1" /> 
      <xs:element name="cms" type="requirement" minOccurs="0" maxOccurs="unbounded" /> 
      <xs:element name="plugin" type="requirement" minOccurs="0" maxOccurs="unbounded" /> 
      <xs:element name="application" type="requirement" minOccurs="0" maxOccurs="unbounded" /> 
      <xs:element name="field" type="requirement" minOccurs="0" maxOccurs="unbounded" /> 
      <xs:element name="php" type="requirement" minOccurs="0" maxOccurs="unbounded" /> 
     </xs:choice> 
    </xs:complexType> 
</xs:element> 

и определение требований:

<xs:complexType name="requirement" mixed="true"> 
    <xs:attribute name="version" use="optional"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:pattern value="(\d+\.)?(\d+\.)?(\d+)?(\.)?(\d+)?" /> 
       <xs:whiteSpace value="preserve" /> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 
    <xs:attribute name="type" use="optional"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:pattern value="function|class" /> 
       <xs:whiteSpace value="preserve" /> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 
</xs:complexType> 

Если вам нравится, вы можете проверить все определение по адресу: https://xml.sigsiu.net/SobiPro/application.xsd

Теперь важная информация: это работает прекрасно и точно так, как мы хотели его

Вопрос заключается в том, что у нас есть очень любопытный и приятный пользователь, который проверил определение и он пытается узнать о XML и XSD и он указал мне на документацию по адресу http://www.w3schools.com/Schema/el_choice.asp, в которой четко указано, что вы, что «xs: choice» позволяет фактически использовать только один из определенных дочерних узлов.

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

Некоторые примеры: http://msdn.microsoft.com/en-us/library/ms256109.aspx

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

http://www.w3schools.com/schema/schema_complex_indicators.asp

Индикатор указывает, что ни один дочерний элемент или другой может произойти:

Так что реальное определение "хз: выбор"?

Позволяет ли он действительно использовать только один из определенных элементов или просто ограничивает возможный выбор следующего дочернего узла для определенных элементов?

ответ

0

OK. Теперь можно соединить точки.

Ваша схема для <requirements> Элемент является правильной схемой для вашего XML. В соответствии с этим, все эти дети, определенные в пределах xs:choice , могут повторяться любое количество раз в любой конфигурации.

Это потому, что у вас есть неограниченная что xs:choice:

<xs:choice minOccurs="0" maxOccurs="unbounded"> 

Здесь, появление атрибутов minOccurs="0" maxOccurs="unbounded" сказать , что это xs:choice может повторяться любое число раз (от 0 до бесконечности). Следовательно, все, что указано в этом xs:choice, может повторяться любое количество раз или смешиваться друг с другом без ограничений.

О том, что «хз: выбор» средства ... Да, xs:choice (то есть один экземпляр этого) позволяет использовать только один элемент среди тех, которые определены в рамках этого выбора. Точнее, xs:choice позволяет использовать только одну вещь среди определенных в ней. Эти «вещи» (называемые «частицы») могут быть фактически не только элементами, , но и другими вариантами, последовательностями, группами. Таким образом, вы можете построить довольно сложное ограничение со всем этим.

+0

Извините, похоже, я дважды вставлял один и тот же код - я только что исправил его. Надеюсь, что это станет понятным :) –

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