2015-10-08 13 views
1

Мне нужно описать следующее в схеме 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.1? В этом случае вы можете использовать утверждения (''). – potame

+0

@potame Я не могу найти ответ прямо сейчас, но я думаю, что не могу (используя 'DOMDocument :: schemaValidate()' в php.) У меня была другая проблема месяцев назад (условный дочерний элемент в зависимости от атрибута type родителя), и я помню, что ответ был найден: это будет возможно, если php интегрирует схему 1.1 ... Я буду искать дальше в этом направлении. – fpierrat

ответ

3

Этого не может быть достигнуто с использованием XSD 1.0, для этого требуется XSD 1.1 и утверждения. Я не думаю, что ваш валидатор схемы по умолчанию в PHP будет поддерживать XSD 1.1.

+0

Затем либо я просто отброшу этот тест, либо я попробую что-то вроде первого XSLT-шага, преобразующего 'item [@ properties = 'nav']' в 'item_nav', затем второй XSD-шаг, подтверждающий это с помощью одного требуемый элемент 'item_nav' и x необязательные элементы' item' ... кажется довольно длинным для того, что я считал простой необходимостью :-( – fpierrat

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

  • Нет связанных вопросов^_^