Есть ли альтернатива ‹assert› в XML Schema 1.0

У меня есть фрагмент документа XSD ниже. Когда XML-файл проверяется на соответствие этой схеме, я хочу убедиться, что значения в mm:Depot и mm:Customer/mm:County одинаковы и ограничиваются элементами типа Location.

Это можно сделать в XML-схеме 1.1 с помощью тега <assert>, но я ДОЛЖЕН проверить на соответствие XML-схеме 1.0. Есть ли какой-нибудь хитрый трюк, чтобы заставить это работать в 1.0?

<xsd:element name="DeliveryOrder" type="OrderDetails" />

<xsd:complexType name="OrderDetails">
    <xsd:sequence>
        <xsd:element name="Depot" type="mm:Location" />
        <xsd:element name="Customer" type="mm:Customer" maxOccurs="1" minOccurs="1" />
    </xsd:sequence> 
</xsd:complexType>

<xsd:simpleType name="Location">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="OverHere" />
        <xsd:enumeration value="OverThere" />
    </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="Customer">   
    <xsd:sequence>
        <xsd:element name="firstname" type="string" />
        <xsd:element name="surname" type="string" />
        <xsd:element name="County" type="mm:Location" />
    </xsd:sequence>
</xsd:complexType>

Я хочу добиться чего-то вроде этого ...

<?xml version="1.0" encoding="UTF-8"?>
<mm:DeliveryOrder xmlns:mm="http://myNamespace/DeliveryOrderSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://myNamespace/DeliveryOrderSchema DeliveryOrder.xsd ">

  <mm:Depot>OverThere</mm:Depot>
  <mm:Customer>
    <mm:firstname>Jane</mm:firstname>
    <mm:surname>Doe</mm:surname>
    <mm:County>OverThere</mm:County>
  </mm:Customer>
</mm:DeliveryOrder>

Обратите внимание, что значение OverThere появляется дважды.


person cymorg    schedule 19.10.2013    source источник


Ответы (1)


Вы можете использовать «ссылочную целостность».

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema targetNamespace="http://myNamespace/DeliveryOrderSchema" xmlns="http://myNamespace/DeliveryOrderSchema" xmlns:mm="http://myNamespace/DeliveryOrderSchema" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="DeliveryOrder" type="OrderDetails">
        <xsd:key name="LocationDepot">
            <xsd:selector xpath="mm:Depot"/>
            <xsd:field xpath="."/>
        </xsd:key>
        <xsd:keyref refer="LocationDepot" name="CustomerLocation">
            <xsd:selector xpath="mm:Customer"/>
            <xsd:field xpath="mm:County"/>
        </xsd:keyref>
    </xsd:element>

    <xsd:complexType name="OrderDetails">
        <xsd:sequence>
            <xsd:element name="Depot" type="Location"/>
            <xsd:element name="Customer" type="Customer" maxOccurs="1" minOccurs="1"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:simpleType name="Location">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="OverHere"/>
            <xsd:enumeration value="OverThere"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:complexType name="Customer">
        <xsd:sequence>
            <xsd:element name="firstname" type="xsd:string"/>
            <xsd:element name="surname" type="xsd:string"/>
            <xsd:element name="County" type="Location"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

Ошибка может выглядеть следующим образом:

Error occurred while loading [], line 10 position 3 The key sequence 'OverHere' in 'http://myNamespace/DeliveryOrderSchema:LocationDepot' Keyref fails to refer to some key.

person Petru Gardea    schedule 19.10.2013