Ключ, тег 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 (который