Ключ, тег keyref в xsd

У меня есть этот XSD

<xs:schema version="1.0"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">
  <xs:element name="foo">
    <xs:complexType>
      <xs:choice>
        <xs:element name="bar" 
                    minOccurs="0" 
                    maxOccurs="unbounded">
          <xs:complexType>
            <xs:attribute name="id" 
                          use="required" 
                          type="xs:string" />
          </xs:complexType>
        </xs:element>
        <xs:element name="batz" 
                    minOccurs="0" 
                    maxOccurs="unbounded">
          <xs:complexType>
            <xs:attribute name="idref" 
                          use="required" 
                          type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
    <xs:key name="ID">
      <xs:selector xpath="./bar" />
      <xs:field xpath="@id" />
    </xs:key>
    <xs:keyref name="IDREF" refer="ID">
      <xs:selector xpath="./batz" />
      <xs:field xpath="@idref" />
    </xs:keyref>
  </xs:element>
</xs:schema>

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

<?xml version="1.0" encoding="UTF-8"?>
<foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'  
     xsi:noNamespaceSchemaLocation=
      'file:/home/tareq/NetBeansProjects/HTML5Application/public_html/refTest.xsd'>
    <bar id="1"/>
    <bar id="2"/>
</foo>

второй:

<?xml version="1.0" encoding="UTF-8"?>
<foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
     xsi:noNamespaceSchemaLocation =
         'file:/home/tareq/NetBeansProjects/HTML5Application/public_html/refTest.xsd'>
    <batz idref="1" /> <!-- this should succeed because <bar id="1"> exists -->
    <batz idref="3" /> <!-- this should FAIL -->
</foo>

проверка говорит об ошибке и работает правильно, когда я заменяю choice пометить с sequence тег и я пишу два XML в одном XML.
проблема появляется в этом xsd, я имею в виду два xml не могут быть ref/keyref между собой.
это то, с чем я сталкиваюсь сейчас, и это то, что я пытаюсь сделать с 3 дня.

2 ответа

Если я вас правильно понимаю, вы хотите использовать ключ XSD и keyref для проверки (а) того, что значения в одном документе XML являются уникальными в этом документе (с использованием xsd:key) и (b) что значения в другом документе XML извлекаются только из значения, указанные в первом документе (используя xsd:keyref).

Цель (а) достижима; Цель (б) не достижима с XSD. Ограничения ссылочной целостности XSD предназначены для использования в одном документе XML, а не за его пределами. Чтобы проверить ограничения целостности через границы документа, вы можете использовать язык моделирования услуг W3C (который, по сути, предназначен для расширения XSD с помощью некоторой проверки целостности документов такого рода) или Schematron. Удачи.

Если я вас правильно понимаю, вы хотите использовать ключ XSD и keyref для проверки (а) того, что значения в одном документе XML являются уникальными в этом документе (с использованием xsd:key) и (b) что значения в другом документе XML извлекаются только из значения, указанные в первом документе (используя xsd:keyref).

Цель (а) достижима; Цель (б) не достижима с XSD. Ограничения ссылочной целостности XSD предназначены для использования в одном документе XML, а не за его пределами. Чтобы проверить ограничения целостности через границы документа, вы можете использовать язык моделирования услуг W3C (который

Другие вопросы по тегам