XML IDREF работает только как атрибут, но не как элемент - PullRequest
0 голосов
/ 23 января 2020

У меня есть следующее XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="simple_model.xsd">
    <cars>
        <passengers>
            <person idref="ud9e69b75-1604-4a85-9747-5ec530b3641b"/>
        </passengers>
    </cars>
    <persons>
        <person myid="ud9e69b75-1604-4a85-9747-5ec530b3641b">
            <name>Paul</name>
        </person>
    </persons>
</root>

с соответствующей схемой:

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

  <xs:element name="root" type="root"/>

  <xs:complexType name="root">
    <xs:sequence>
      <xs:element name="cars" type="car" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="persons" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="person" type="person" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="car">
    <xs:sequence>
      <xs:element name="passengers" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="person" type="referencePerson" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="referencePerson">
    <xs:sequence/>
    <xs:attribute name="idref" type="xs:IDREF"/>
  </xs:complexType>

  <xs:complexType name="person">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="myid" type="xs:ID"/>
  </xs:complexType>
</xs:schema>

Когда я сейчас вызываю idref("ud9e69b75-1604-4a85-9747-5ec530b3641b")/.., он возвращает меня: <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" idref="ud9e69b75-1604-4a85-9747-5ec530b3641b"/>

Пока все хорошо. Но когда я меняю idref с атрибута на элемент. Например:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="simple_model.xsd">
    <cars>
        <passengers>
            <person>u74835c8c-e793-4fca-a370-27ff6f3f06d7</person>
        </passengers>
    </cars>
    <persons>
        <person myid="u74835c8c-e793-4fca-a370-27ff6f3f06d7">
            <name>Paul</name>
        </person>
    </persons>
</root>

и соответствующая схема меняется на:

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

  <xs:element name="root" type="root"/>

  <xs:complexType name="root">
    <xs:sequence>
      <xs:element name="cars" type="car" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="persons" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="person" type="person" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="car">
    <xs:sequence>
      <xs:element name="passengers" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="person" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="person">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="myid" type="xs:ID"/>
  </xs:complexType>
</xs:schema>

Тогда вызов idref("u74835c8c-e793-4fca-a370-27ff6f3f06d7") ничего не возвращает. Я пробовал это с BaseX и XML автором, но оба не показывают результатов. Вы знаете, что я пропустил?

1 Ответ

1 голос
/ 23 января 2020

В Saxon все работает как положено, поэтому я думаю, что это либо проблема c, специфичная для продукта, либо что-то, что связано с тем, как вы выполняете запрос.

...