2017-06-04 67 views
0

我有一個XML文檔,其中包含一系列重複的地址,其實際內容取決於所包含枚舉的值。我想這是一種「標籤聯合」 [或「可識別聯合」?]:用於標記聯盟的XML模式

{ 
<AddressList> 
    <Address> 
     <AddressType type="addressEnum" fixed="CanadianAddress"/> 
     <AddressValue> 
      <Street type="textstring">123 Yonge Street</Street> 
      <Province type="provinceEnum" value="Ontario"/> 
      <PostalCode type="postalCodeType" value="M1N 2O3"/> 
     </AddressValue> 
    </Address> 
    <Address> 
     <AddressType type="addressEnum" fixed="USAddress"/> 
     <AddressValue> 
      <Street type="textstring">456 Front Street</Street> 
      <State type="stateEnum" value="New York"/> 
      <ZipCode type="zipCodeType" value="12345"/> 
     </AddressValue> 
    </Address> 
</AddressList> 
} 

我不清楚如何表達XML模式[即XSD]爲上述XML。我需要一個'CanadianAddressType'和'USAddressType'將會擴展的空'AddressType'嗎?如果我有50個AddressType,我是否需要50個這樣的擴展名?

注意:如果不明顯,USAddress的元素不能出現在CanadianAddress枚舉之後。同樣,CanadianAddress元素不能出現在USAddress枚舉之後。

回答

0

可以通過使用XSD 1.1的alternative組件。然後你就可以在依賴於AddressType元素的fixed屬性值<AddressValue>節點應用的類型,所以

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/XMLSchema.xsd" 
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
    vc:minVersion="1.1"> 
    <xs:element name="AddressList" > 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Address" minOccurs="1" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:sequence minOccurs="1" maxOccurs="1"> 
       <xs:element name="AddressType" type="AddressTypeTag"/> 
       <xs:element name="AddressValue" type="USAddressValue"> 
       <xs:alternative test="../AddressType/@fixed='CanadianAddress'" type="CanadianAddressValue"/> 
       <xs:alternative test="../AddressType/@fixed='USAddress'" type="USAddressValue"/> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="CanadianAddressValue"> 
    <xs:sequence minOccurs="1" maxOccurs="1"> 
     <xs:element name="Street" type="StreetValue"/> 
     <xs:element name="Province" type="TypeAndValue"/> 
     <xs:element name="PostalCode" type="TypeAndValue"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="USAddressValue"> 
    <xs:sequence minOccurs="1" maxOccurs="1"> 
     <xs:element name="Street" type="StreetValue"/> 
     <xs:element name="State" type="TypeAndValue"/> 
     <xs:element name="ZipCode" type="TypeAndValue"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="StreetValue"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute name="type" type="xs:string"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="TypeAndValue"> 
    <xs:attribute name="type" type="xs:string"/> 
    <xs:attribute name="value" type="xs:string"/> 
    </xs:complexType> 
    <xs:complexType name="AddressTypeTag"> 
    <xs:attribute name="type" fixed="addressEnum" type="xs:string" /> 
    <xs:attribute name="fixed" > 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="CanadianAddress"></xs:enumeration> 
      <xs:enumeration value="USAddress"></xs:enumeration> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 
    </xs:complexType> 
</xs:schema> 
+0

我並不熱衷於具有XML 1.1依賴; (幾乎)沒有人使用它,並且幾乎沒有實現。特別是,我想使用libxml2,它不支持XML 1.1。 但是,儘管如此,我沒有看到上述模式如何在'USAddress'枚舉和'USAddressValue'之間創建強制關聯。 – badfd

+0

@badfd,我不知道如何可能,但我只發佈了模式的最後一部分。我將盡力在明天找到完整的模式。在XSD 1.0中,具有相同名稱的元素必須具有相同的定義良好的類型(請參閱[類似主題](https://stackoverflow.com/q/1306305/7914637))。 – Alexander

+0

@badfd,我已經更新了我的答案。現在模式已經完全顯示。我以前的評論描述了使用XSD 1.1的原因。祝你好運! – Alexander