2015-07-28 18 views
3

Я пытаюсь придумать схему XSD 1.0 со следующими ограничениями:XSD схема с неупорядоченными требуется, необязательные и произвольными тегами

  1. Существует нет заказа
  2. Некоторых элементов не должны появляться ровно один раз
  3. Некоторые элементы могут появиться ноль или неограниченными раз
  4. Разрешить непризнанные элементы (не проверять их)

В г eason для 3. заключается в том, что я хотел бы проверить тип, если элемент присутствует.

Например, у человека должно быть только одно имя, необязательный возраст (не более одного), дополнительные номера телефонов (без ограничений) и любые другие теги. Они должны проверить:

<person> 
    <name>Bob</name> 
    <age>33</age> 
    <phone>123456789</phone> 
    <phone>123456788</phone> 
</person> 

<person> 
    <name>Alice</name> 
</person> 

<person> 
    <name>John</name> 
    <!-- unrecognized, arbitrary tags: --> 
    <location>city</location> 
    <occupation>laywer</occupation> 
</person> 

Принимая во внимание, они должны не Validate:

<person> 
    <!-- I am missing a name --> 
    <phone>123456789</phone> 
</person> 

<person> 
    <!-- I should only have one name --> 
    <name>Sally</name> 
    <name>Mary</name> 
</person> 

<person> 
    <name>Josh</name> 
    <!-- Phone number is not an int --> 
    <phone>not a number</phone> 
</person> 

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

<xs:element name="person"> 
    <xs:complexType> 
    <xs:all> 
     <xs:element type="xs:string" name="name" minOccurs="1" maxOccurs="1"/> 
     <xs:element type="xs:int" name="age" minOccurs="0" maxOccurs="1"/> 
     <xs:element type="xs:int" name="phone" minOccurs="0" maxOccurs="unbounded"/> 
     <xs:any /> 
    </xs:all> 
    </xs:complexType> 
</xs:element> 

Этот XSD недействителен, поскольку вы не можете использовать <any> под номером <all>, а поскольку XSD 1.0 не позволяет вам o имеют maxOccurs="unbounded" в элементе <all>. Кто-нибудь знает, как это можно сделать?

ответ

2

Вы можете делать то, что ищете, используя xs:all в XSD 1.1.

Этого не может быть достигнуто в XSD 1.0.

+0

Я надеялся, что это будет возможно с XSD 1.0. Спасибо, что подтвердили, что это невозможно. – Theo

+0

Возможно ли это с RNG? Я написал схему RNG, которая удовлетворяла 1., 2. и 3. вышеуказанных ограничений, но не могла найти эквивалент RNG - любые идеи? – Theo

+1

Поднять новый вопрос. –