Я пытаюсь придумать XSD для этого вида XML:XSD: выбор, основанный на состоянии элемента
<root>
<valid>
<a>1</a>
<b>foo</b>
<c>bar</c>
</valid>
<valid>
<a>2</a>
<c>bar</c>
<d1>baz</d1>
</valid>
<valid>
<a>3</a>
<c>bar</c>
<d2>baz-restricted</d2>
<e>qux</e>
</valid>
</root>
Во всех элементах названных valid
, каждый ребенок-элемент является обязательным.
Я знаю, что мне нужно сделать xs:choice
условным значением a
, так как ниже XSD является двусмысленным при втором появлении c
.
Как это можно сделать в XSD, поддерживаемом .NET 4.x?
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="valid">
<xs:complexType>
<xs:sequence>
<xs:element name="a" minOccurs="1" maxOccurs="1"/>
<xs:choice>
<xs:sequence>
<xs:element name="b" minOccurs="1" maxOccurs="1"/>
<xs:element name="c" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
<xs:sequence>
<xs:element name="c" minOccurs="1" maxOccurs="1"/>
<xs:element name="d1" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
<xs:sequence>
<xs:element name="c" minOccurs="1" maxOccurs="1"/>
<xs:element name="d2" minOccurs="1" maxOccurs="1"/>
<xs:element name="e" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
(я знаю XSD вложенной может быть лучше использовать пользовательские типы. В случае необходимости, я могу сделать это на заказ, просто дайте мне знать, если это на самом деле, необходимое для решения, и я буду).
Спасибо. Что делать, если мы можем переключиться на Saxon для .NET? Будет ли решение XSD 1.1 стать беспорядком? –
Нет, Saxon позволит использовать XSD 1.1, который более выразителен, чем XSD 1.0; см. 'xs: assertion' и присвоение условного типа (' xs: alternative'). Однако, если все еще возможно, подумайте о переименовании разных «действительных» элементов и избегайте необходимости в усовершенствованных средствах XSD 1.1; это не для того, чтобы избежать «беспорядка», а скорее для того, чтобы следовать общей практике наименования имен XML, в которой разные элементы называются по-разному. – kjhughes
«Лучшая практика» - это то слово, которое я искал. Благодарю. Я полностью переработал XSD сейчас, поскольку сторона, которая его доставила, была в порядке с редизайном, тогда как я думал, что существующая база дизайна была исправлена. –