2015-10-16 43 views
0

請考慮下面的XML:XSD架構強制性內容

<?xml version="1.0" encoding="utf-8"?> 
<asset> 
    <object name="pippo" logical="pippo"></object> 
    <object name="pluto" logical="pluto"></object> 
    <object name="paperino" logical="paperino"></object> 
    <object name="ziopaperone" logical="paperino"></object> 
    <object name="topolino" logical="paperino"></object> 
</asset> 

我需要寫有以下限制的模式:名稱爲「皮波」

  1. 對象和「冥王星」絕存在且僅出現一次
  2. 具有其他名稱的對象可能存在或不存在
  3. 屬性「名稱」和「邏輯」必須相同(但這不是強制性的)

我已經能夠指定點號1,通過指定名稱的simpleType作爲xs:ID的一個子集,並對值有限制,但我無法弄清楚如何將點1與點2.

你能幫我嗎?這可能嗎?

謝謝

回答

0

你所追求的是不與XSD直接的,因爲它會要求你創建三種類型(一個用於「皮波」,一爲「冥王星」,一個用於其餘部分),但具有相同的元素名稱。根據定義,任何具有相同路徑的元素必須具有相同的類型。如果您想嘗試你的建議是什麼,您會收到以下錯誤:

E [Xerces] cos-element-consistent: Error for type 'objectType'. Multiple elements with name 'object', with different types, appear in the model group.

由於所有的規則都作爲基本規則,即「任何事情都會發生」,這是不可能的XSD單獨1.0解決這個問題,因爲它會產生含糊的元素:處理器無法知道上例中的第一個object是「其他名稱的對象」類型,還是「只有pippo/pluto」類型。這種模糊不允許(如果有人試圖將模型映射到POCO或POJO上,會產生問題)。

但是,有一種解決方法。如果您可以使用XSD 1.1,則可以使用斷言。例如,下面的作品(包括您的規則#3,但執行(如在你問了這句話的半句就變成沒有規則可言):

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="urn:test" 
    targetNamespace="urn:test" 
    elementFormDefault="qualified" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
    vc:minVersion="1.1"> 

    <xs:element name="asset" type="objectType">   
    </xs:element> 

    <xs:complexType name="objectType"> 
     <xs:sequence minOccurs="2" maxOccurs="unbounded"> 
      <xs:element name="object" type="objectOtherType"/> 
     </xs:sequence> 
     <xs:assert test="object[1]/@name = 'pippo'" xpathDefaultNamespace="##targetNamespace"/> 
     <xs:assert test="object[2]/@name = 'pluto'" xpathDefaultNamespace="##targetNamespace"/> 
     <xs:assert test="every $o in object satisfies $o/@logical = $o/@name" xpathDefaultNamespace="##targetNamespace"/> 
    </xs:complexType> 

    <xs:complexType name="objectOtherType"> 
     <xs:attribute name="name" type="otherNames" use="required" /> 
     <xs:attribute name="logical" type="otherNames" use="required" /> 
    </xs:complexType> 

    <xs:simpleType name="otherNames"> 
     <xs:restriction base="xs:string" /> 
    </xs:simpleType> 

</xs:schema> 

如果XSD 1.1是不可能的在你的情況下,你應該重新考慮你的對象模型(這可能是一個好主意),例如,通過使用具有獨特屬性的元素的唯一名稱,以便您可以強制執行該模型。作爲另一種選擇,可以考慮使用RelaxNG或Schematron作爲模式語言,它們都允許這種約束。您還可以將Schematron(它非常類似於XSD 1.1中的斷言)與現有的XSD模式結合使用