2013-10-19 9 views
5

以下のXSDドキュメントの断片があります。 XMLファイルがこのスキーマに対して妥当性を確認したら、mm:Depotmm:Customer/mm:Countyの値が同じで、Locationタイプのアイテムに限定されていることを確認したいと思います。<assert>の代替手段はXML Schema 1.0です

これは<assert>タグを使用してXMLスキーマ1.1で行うことができますが、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> 

注値​​が二回表示されます。

答えて

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.