Что не так с этим xsd? - PullRequest
       27

Что не так с этим xsd?

1 голос
/ 18 декабря 2009

Следующий XSD должен проверить, что атрибут name элемента favorite_fruit должен содержать только names из fruit в элементе fruits. Вот XSD:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:complexType name="Fruit">
    <xsd:attribute name="name" type="xsd:string"/>
  </xsd:complexType>  

  <xsd:complexType name="FruitArray">
    <xsd:sequence>
      <xsd:element name="fruit" minOccurs="0" maxOccurs="unbounded" type="Fruit"/>
    </xsd:sequence>
  </xsd:complexType> 

  <xsd:element name="fruit_basket">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="fruits" minOccurs="1" maxOccurs="1" type="FruitArray"/>
        <xsd:element name="favourite_fruit" minOccurs="1" maxOccurs="1">
          <xsd:complexType>
            <xsd:attribute name="name" use="required"/>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType> 

    <xsd:key name="fruit_lookup">
      <xsd:selector xpath="fruits/fruit"/>
      <xsd:field xpath="@name"/>
    </xsd:key>

    <xsd:keyref name="favourite_fruit_constraint" refer="fruit_lookup">
      <xsd:selector xpath="favourite_fruit"/>
      <xsd:field xpath="@name"/>
    </xsd:keyref>    
  </xsd:element>
</xsd:schema>

Следующий xml должен быть действительным, но при проверке недействительным:

<fruit_basket>
  <fruits>
    <fruit name="Apple"/>
    <fruit name="Peach"/>
    <fruit name="Bananna"/>
  </fruits>

  <favourite_fruit name="Apple"/>
</fruit_basket>

Есть идеи? Я чувствую, что с моим xpath что-то не так. PS: я использую lxml для проверки xml на xsd.

Ответы [ 2 ]

1 голос
/ 21 декабря 2009

Анонимный комплексный тип определяет атрибут «имя» без типа. Тип Fruit имеет атрибут name с типом: xsd: string. Поскольку два атрибута не имеют одинаковый тип, они не могут совпадать. Таким образом, изменив определение атрибута анонимного сложного типа на: works.

0 голосов
/ 18 декабря 2009

Вы не указали тип для xsd:element из favourite_fruit. Таким образом, схема не может проверяться по типу Fruit:

    <xsd:element name="favourite_fruit" minOccurs="1" maxOccurs="1">
      <xsd:complexType>
        <xsd:attribute name="name" use="required"/>
      </xsd:complexType>
    </xsd:element>

Нигде вы не ограничиваете тип Fruit. Это должно работать лучше:

   <xsd:element name="favourite_fruit" minOccurs="1" maxOccurs="1" Type="Fruit" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...