Мне нужно описать следующее в схеме XML: один элемент должен встречаться 1 или более раз, но точно одно вхождение этого элемента должно иметь атрибут "свойства" присвоено значение "нав"Один или несколько элементов, по крайней мере один с заданным значением для атрибута
Пример:
<manifest>
<item href="example" id="02" properties="cover-image" /> <!-- optional item -->
<item href="dummy" id="sample" properties="nav" /> <!-- mandatory item with "nav" value for "properties" attribute -->
<item href="example" id="02" properties="mathlm scripted" /> <!-- optional item -->
</manifest>
Мой "лучший" попытка была:
<xs:element name="manifest">
<xs:complexType>
<xs:choice>
<xs:element name="item" minOccurs="1" maxOccurs="1" ><!-- at least one (item property="nav")-->
<xs:complexType>
<xs:attribute name="href" type="xs:string" use="required" />
<xs:attribute name="id" type="xs:string" use="required" />
<xs:attribute name="media-type" type="xs:string" use="required" />
<xs:attribute name="fallback" type="xs:string" />
<xs:attribute name="properties" type="xs:string" use="required" fixed="nav" />
<xs:attribute name="media-overlay" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:element name="item" minOccurs="0" maxOccurs="unbounded" >
<xs:complexType>
<xs:attribute name="href" type="xs:string" use="required" />
<xs:attribute name="id" type="xs:string" use="required" />
<xs:attribute name="media-type" type="xs:string" use="required" />
<xs:attribute name="fallback" type="xs:string" />
<xs:attribute name="properties" type="xs:string" />
<xs:attribute name="media-overlay" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:choice>
<xs:attribute name="id" type="xs:string" />
</xs:complexType>
</xs:element>
Bad попробовать, хотя, так как валидатор дает мне следующую ошибку:
local complex type: The content model is not determinist.
Это ясно, что эта схема не является детерминированной, так как валидатор не может решить, что он должен проверить встреченной item
элемент с первым или второе из двух определений для этого элемента ...
... но как я могу это достичь? Это вообще возможно ?
Можете ли вы использовать схему 1.1? В этом случае вы можете использовать утверждения (''). –
potame
@potame Я не могу найти ответ прямо сейчас, но я думаю, что не могу (используя 'DOMDocument :: schemaValidate()' в php.) У меня была другая проблема месяцев назад (условный дочерний элемент в зависимости от атрибута type родителя), и я помню, что ответ был найден: это будет возможно, если php интегрирует схему 1.1 ... Я буду искать дальше в этом направлении. – fpierrat