2011-05-26 70 views
0

我一直在負責編寫XML文檔的解析與被人據稱更聰明,比我更有經驗,我沒有XML專家,但是從我所知道的,我相信有一些創造了一個支持架構他們的模式中缺少的考慮。XML架構:AttributeGroup沒有支持元素?重複的屬性?

這裏的架構的簡化版本,我一直在考慮:

<?xml version="1.0"?> 
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
     <xsd:attributeGroup name="Group1"> 
      <xsd:attribute name="attrib1" type="xsd:NMTOKENS"/> 
      <xsd:attribute name="attrib2" type="xsd:NMTOKENS"/> 
     </xsd:attributeGroup> 
</xsd:schema> 

我走之前回到我的客戶,並批評他們的架構設計,我會很感激的集體智慧計算器證實或否認對我來說如下:

  1. attributeGroup應該被模式中的某種元素使用。僅在模式中獨立存在attributeGroup是沒有意義的。 (除非此架構旨在被導入到另一個)
  2. 一個attributeGroup內的屬性只能有效的XML文檔的單個元件內出現一次。例如:

    <?xml version="1.0"?> 
    <element1 attrib1="first second third" attrib1="first second third"/> 
    

    是無效的,因爲有一個重複的'attrib1',正確嗎?

    • 我被告知可能會收到具有重複屬性的文檔。我想告訴我的客戶,模式需要反映這種可能性(如果這甚至可能......)。有沒有辦法定義一個可能出現多次的屬性?我知道'maxOccurs'屬性,但我不認爲這對屬性定義有效。

在此先感謝您的意見。

回答

1

attributeGroup應該被 使用,在模式中的某種元素。 它沒有任何意義,只是有一個 attributeGroup在 架構獨自站立。

嗯,這取決於它是否有道理,還是沒有。在XML中,屬性就像「附加到元素的額外信息」。因此,在實例文檔中,如果沒有「託管」它的元素,則不能存在該屬性。有實例文檔中的屬性要求1)存在具有該屬性2)架構中的該屬性以某種方式定義或引用的元素。如果架構中沒有元素被定義(允許)使用某個屬性,那麼該屬性不能出現在實例文檔中。

再說,限定了不使用被允許的屬性,它不是一個錯誤。在某些情況下,這可能是合理的,例如爲了容易採用未來計劃的功能,或者允許將模式導入或包括到可以利用這些屬性的另一模式中。

的屬性的attributeGroup 內只能在有效 xml文檔內出現一次。例如:

<?xml version="1.0"?> <element1 attrib1="first second third" attrib1="first second third"/>

是無效的,因爲有一個 重複 'attrib1',正確嗎?

你的代碼示例很清楚:這在XML中是不允許的。由於stated in the XML recommendation:「屬性名稱不能在相同的開始標籤或空白標籤中出現多次。」然後再次,您在代碼示例上面寫的聲明不完全正確。有可能相同的屬性可以在有效的XML文檔中多次出現。它只是出現在不同的元素上。不允許在一個元素上覆制屬性但是,您可以複製元素以使它們具有相同的屬性。

不允許:

<element1 attrib1="first second third" attrib1="first second third"/> 

允許:

<element1 attrib1="first second third"/> 
<element1 attrib1="first second third"/> 

作爲一個角落的情況下,重複的屬性名稱適用於擴展名的屬性

<element ns1:attrib="value" ns2:attrib="value"/> 

是不允許的,如果兩個前綴ns1ns2決心同一個命名空間URI。

+0

感謝您的回覆。我同意你的意見,我的代碼示例之前的聲明是錯誤的。我打算解釋我的代碼示例中明確的內容。我會解決這個問題。我想我理解你關於「主機」元素的觀點,以及他們的模式定義在技術上不是一個錯誤。我的問題是這個模式是出於所有的意圖和目的,'父'模式如此不會在_this_模式中缺少「主機」元素,從本質上限制了在有效實例文檔中attributeGroup中使用這些屬性?再次感謝您的輸入! – Thedaego 2011-05-26 14:20:41

+0

@Taeaego你的假設是正確的。如果這個模式**沒有:** 1)任何具有'foobar'屬性的元素,2)任何帶有的元素(因此它可以包含任何屬性)以及3)任何''或''定義,那麼即使模式具有這種屬性的全局屬性定義,作爲該模式文件的實例的文檔也不能包含屬性'foobar'。 – jasso 2011-05-27 12:59:49