Ключ XML-схемы к обнуляемому внешнему ключу - PullRequest
0 голосов
/ 07 ноября 2018

Учитывая следующую схему, есть ли способ позволить внешнему ключу быть пустым и при этом иметь keyref, проверяющий, что если используется идентификатор, он действителен?

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="EmptyType">
    <xs:restriction base="xs:string">
      <xs:maxLength value="0"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="OptionalIdType">
    <xs:union memberTypes="EmptyType xs:int"/>
  </xs:simpleType>

  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="id" type="xs:int" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="list">
          <xs:complexType>
            <xs:sequence minOccurs="0" maxOccurs="unbounded">
              <xs:element name="id" type="OptionalIdType"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>

    <xs:key name="key">
      <xs:selector xpath="id"/>
      <xs:field xpath="."/>
    </xs:key>

    <xs:keyref name="keyref" refer="key">
      <xs:selector xpath="list/id"/>
      <xs:field xpath="."/>
    </xs:keyref>
  </xs:element>

</xs:schema>

Пример XML-документа для схемы:

<root>
  <id>1</id><id>2</id>
  <list>
    <id>1</id>
    <id>3</id>
    <id/>
  </list>
</root>

Проверка этого с помощью xmllint дает следующую ошибку, как и ожидалось:

test.xml:5: Schemas validity error : Element 'id': No match found for key-sequence ['3'] of keyref 'keyref'.
test.xml:6: Schemas validity error : Element 'id': No match found for key-sequence [''] of keyref 'keyref'.

Есть ли способ изменить схему, чтобы разрешить второй случай?

...