2013-10-19 91 views
5

我在下面有一個XSD文檔片段。當XML文件根據此模式進行驗證時,我希望確保mm:Depotmm:Customer/mm:County中的值相同,並且僅限於Location類型中的項目。XML Schema 1.0中是否有<assert>的替代方案

這可以在XML Schema 1.1中使用<assert>標籤完成,但我必須針對XML Schema 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.

相關問題