2015-03-19 3 views
1

Я хочу, чтобы проверить следующий XML, не навязывая порядок пунктов:XSD и xmllint: замена хз: последовательность с хз: все выдает ошибку

<?xml version='1.0' encoding='ISO-8859-1'?> 
<root> 
    <name>Map corners</name> 
    <point>NW</point> 
    <point>SW</point> 
    <point>NE</point> 
    <point>SE</point> 
</root> 

Мой XSD является:

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="root"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="name" type="xs:string"/> 
     <xs:element name="point" type="xs:string" fixed="NW"/> 
     <xs:element name="point" type="xs:string" fixed="SW"/> 
     <xs:element name="point" type="xs:string" fixed="NE"/> 
     <xs:element name="point" type="xs:string" fixed="SE"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

xmllint проверяет мой XML.

Но если я заменю хз: последовательность с хз: все (освободить ограничение порядка: SW может быть, прежде чем NW), он не проверяет, и у меня есть следующее сообщение:

my6.xsd: 4: element complexType: ошибка парсера схемы: локальный сложный тип: модель контента не является детерминированной.

Я что-то пропустил?

ответ

1

В XSD 1.0 вы не можете использовать xsd: any с повторяющейся частицей элемента. Вы можете сделать что-то вроде этого:

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="name" type="xs:string"/> 
       <xs:element name="point" minOccurs="4" maxOccurs="4"> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:enumeration value="NW"/> 
          <xs:enumeration value="SW"/> 
          <xs:enumeration value="NE"/> 
          <xs:enumeration value="SE"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:key name="pk_points"> 
      <xs:selector xpath="point"/> 
      <xs:field xpath="."/> 
     </xs:key> 
    </xs:element> 
</xs:schema> 
+0

Спасибо Петру. Добавление ограничения идентификации полезно избегать, например, NW, NW, NW, SE. Это означает: «это (.)« Точка »должна быть уникальной» (с использованием xs: key и xs: unique почти одинаковы). См. Также: http://docstore.mik.ua/orelly/xml/schema/ch09_02.htm –

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