К сожалению,
XSD не разрешают то, что вы пытаетесь сделать (объедините <sequence/>
и <all />
внутри одного сложного типа или элемента). Возможно, вам удастся добиться чего-то похожего с моделью вложенного контента, но учтите, что вы не можете вкладывать <all>
, кроме как под другим <all />
, в противном случае вы должны определить это в другом элементе. Однако вы можете вкладывать либо <sequence>
, либо <choice>
друг в друга.
Из моего понимания XSD у вас есть 3 жизнеспособных варианта.
Во-первых, вложите все элементы, которые вы хотите в <all />
, в свои собственные подэлементы:
<xs:complexType name="Original">
<xs:sequence>
<!-- AssetIdentifier to FormatType left out for brevity -->
<xs:element name="Misc">
<xs:complexType>
<xs:all>
<xs:element maxOccurs="1" minOccurs="0" name="StockBrand" type="xs:string" />
<xs:element maxOccurs="1" minOccurs="0" name="TapeModel" type="xs:string" />
<xs:element maxOccurs="1" minOccurs="0" name="TapeWidth" type="xs:string" />
</xs:all>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<!-- For the above, valid XML would be: -->
<Original>
<AssetIdentifier>AssetIdentifier0</AssetIdentifier>
<Title>Title0</Title>
<RecordDate>2006-05-04</RecordDate>
<FormatType>FormatType0</FormatType>
<Misc>
<!-- Optional & order doesn't matter -->
<StockBrand>what</StockBrand>
<TapeWidth>1290</TapeWidth>
<TapeModel>Hey</TapeModel>
</Misc>
</Original>
Во-вторых, вложите эти элементы в другой <sequence />
, что позволяет go указать другой подэлемент, но теперь требует, чтобы элементы отображались в порядке, указанном в схеме. Обратите внимание, что сама вложенная последовательность может быть необязательной.
<xs:complexType name="Original">
<xs:sequence>
<!-- AssetIdentifier to FormatType left out for brevity -->
<xs:sequence minOccurs="0">
<xs:element maxOccurs="1" minOccurs="0" name="StockBrand" type="xs:string" />
<xs:element maxOccurs="1" minOccurs="0" name="TapeModel" type="xs:string" />
<xs:element maxOccurs="1" minOccurs="0" name="TapeWidth" type="xs:string" />
</xs:sequence>
</xs:sequence>
</xs:complexType>
<!-- For the above, valid XML would be: -->
<Original>
<AssetIdentifier>AssetIdentifier0</AssetIdentifier>
<Title>Title0</Title>
<RecordDate>2006-05-04</RecordDate>
<FormatType>FormatType0</FormatType>
<!-- Optional below, but must be ordered -->
<StockBrand>what</StockBrand>
<TapeModel>Hey</TapeModel>
<TapeWidth>1290</TapeWidth>
</Original>
Существует третий вариант, который немного "взломан", но все же позволяет указывать элементы go неупорядоченным, все еще остается необязательным, но все еще появляется рядом с другими обязательными, упорядоченными элементами. Это вложит выбор (с maxOccurs = "3" ) в последовательности, внутри родительской последовательности (sequence> sequence> choice):
<xs:complexType name="Original">
<xs:sequence>
<!-- AssetIdentifier to FormatType left out for brevity -->
<xs:sequence>
<xs:choice maxOccurs="3" minOccurs="0">
<xs:element name="StockBrand" type="xs:string"/>
<xs:element name="TapeModel" type="xs:string"/>
<xs:element name="TapeWidth" type="xs:string"/>
</xs:choice>
</xs:sequence>
</xs:sequence>
</xs:complexType>
<!-- For the above, valid XML would be: -->
<Original>
<AssetIdentifier>AssetIdentifier0</AssetIdentifier>
<Title>Title0</Title>
<RecordDate>2006-05-04</RecordDate>
<FormatType>FormatType0</FormatType>
<!-- Optional, unordered, but there's a catch: -->
<TapeWidth>1290</TapeWidth>
<StockBrand>what</StockBrand>
<TapeModel>Hey</TapeModel>
</Original>
Однако с этим 3-м вариантом есть подвох maxOccurs="3"
на элементе <choice />
делает minOccurs
и maxOccurs
на дочерних элементах (StockBrand
, TapeModel
и TapeWidth
) бессмысленными; это означает, что эти элементы, оставаясь необязательными, теперь могут появляться более одного раза, при условии, что совокупное количество элементов по-прежнему равно 3 или менее:
Это становится действительным (2 из того же элемента + еще 1) :
<TapeWidth>1290</TapeWidth>
<TapeWidth>1291</TapeWidth>
<TapeModel>Hey</TapeModel>
И это все еще действует (3 одинаковых):
<TapeWidth>1290</TapeWidth>
<TapeWidth>1291</TapeWidth>
<TapeWidth>1292</TapeWidth>
И также это (только 1 вхождение 1 элемента):
<StockBrand>1290</StockBrand>
Возможно, вы могли бы попытаться найти другой вариант, поигравшись с сочетанием последовательности и вложенности выбора, но лучше всего сохранять свои схемы простыми. Лично я бы порекомендовал первые 2 варианта, а не третий, чтобы ваша схема была простой.