Налагането на ограничения на XSD ключ и keyref не работи добре с дефиниция на рекурсивна схема

Опитвам се да наложа ключови и референтни ограничения в моя персонализиран XML формат, като използвам елементите <xs:key> и <xs:keyref> на XSD. Не работи както бих искал.

Първо примерен екземпляр на моя XML формат:

<room xmlns="http://example.com">
  <box>
    <item name="x" uses="y" />
    <item name="y" uses="z" />
    <item name="z" />
    <box>
      <item name="p" uses="q" />
      <item name="q" uses="r" />
      <item name="r" />
      <box>
      </box>
    </box>
  </box>
</room>

Тази структура от данни описва "стая" с една "кутия" в нея. Една кутия може да съдържа предмети и други кутии. Една кутия може да бъде и празна. Елементите в кутия трябва да имат различни имена (но могат да споделят име с елементи в други кутии) и могат да „използват“ само други елементи, които са в същата кутия.

Опитвам се да запазя целостта на графиката "употреби", като използвам ключове/ключови връзки за съответните атрибути. Въпреки това, когато използвам Xerces 2 валидатора на този XML, като използвам схемата по-долу, получавам следната грешка:

[Error] file:///example.xml:13:11: cvc-identity-constraint.4.3: Key 'ItemKeyRef' with value 'q' not found for identity constraint of element 'box'.
[Error] file:///example.xml:14:9: cvc-identity-constraint.4.3: Key 'ItemKeyRef' with value 'y' not found for identity constraint of element 'box'.

Схема:

<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:example="http://example.com"
  targetNamespace="http://example.com"
  elementFormDefault="qualified"
  attributeFormDefault="unqualified">

  <xs:element name="room" type="example:Room" />

  <xs:complexType name="Room">
    <xs:all>
      <xs:element ref="example:box" />
    </xs:all>
  </xs:complexType>

  <xs:element name="box" type="example:Box">
    <xs:keyref name="ItemKeyRef" refer="example:ItemKey">
      <xs:selector xpath="./example:item" />
      <xs:field xpath="@uses" />
    </xs:keyref>
    <xs:key name="ItemKey">
      <xs:selector xpath="./example:item" />
      <xs:field xpath="@name" />
    </xs:key>
  </xs:element>

  <xs:complexType name="Box">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="item" type="example:Item" />
      <xs:element ref="example:box" />
    </xs:choice>
  </xs:complexType>

  <xs:complexType name="Item">
    <xs:attribute name="name" type="xs:string" use="required" />
    <xs:attribute name="uses" type="xs:string" />
  </xs:complexType>
</xs:schema>

Имам чувството, че правя нещо много грешно. Защо получавам тази грешка? Това не трябва ли да потвърди?


person pancake    schedule 22.01.2015    source източник


Отговори (1)


Открих, че Xerces2 Java Parser 2.11.0, който използвах, съдържа някои грешки при използване на дефиниции на рекурсивни елементи и ключове/ключови връзки. Когато се опитах да валидирам горния XML с помощта на oXygen XML Developer, той успя, което ме кара да повярвам на доклада за грешка на Проследяването на проблеми на Apache е точно.

person pancake    schedule 23.01.2015