2011-05-15 63 views
4

說我不知道​​元素的名字會是什麼,但我知道孩子會是什麼。例如,沒有規定名稱「foo」和「bar」,但是「A」,「B」是「C」。XSD可以定義通配符複雜類型嗎?

<example> 
    <foo> 
     <A>A</A> 
     <B>B</B> 
     <C>C</C> 
    </foo> 
    <bar> 
     <A>A</A> 
     <B>B</B> 
     <C>C</C> 
    </bar> 
</example> 

我不能離開name屬性,因爲這是違規行爲。我希望能夠做到這一點,而不是:

<xs:element name="example"> 
    <xs:complexType> 
     <xs:sequence maxOccurs="unbounded"> 
      <xs:any> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="A" type="xs:string"/> 
         <xs:element name="B" type="xs:string"/> 
         <xs:element name="C" type="xs:string"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:any> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

這也不管用,<xs:any>只能包含註釋和拒絕一個類型。

有沒有什麼我可以用命名空間來處理未知元素名稱?我應該放棄,而不是試圖驗證孩子,只記錄內容必須是什麼?

回答

0

在XML Schema中,你無法完成你想要做的事情。有一個密切的解決方案,但不是你想要的:

<xs:element name="example"> 
    <xs:complexType> 
     <xs:sequence maxOccurs="unbounded"> 
      <xs:any namespace="##other" processContents="lax"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

現在你可以提供單獨的模式,一爲foo,在一個單獨的命名空間,在一個單獨的模式文件:

<xs:element name="foo"> 
    <xs:complexType> 
     .... 
    </xs:complexType> 
</xs:element> 

這是對所有你能做到(這是你的「多個命名空間」解決方案)。你無法完全避免列出元素。如果與processContents設置爲skip還不夠好,那麼<xsd:any>是你唯一的解決方案,其次是外部驗證(代碼,Schematron的,等等)

+0

外部驗證是我唯一的剩餘選項。 – clockworkgeek 2011-05-16 10:50:39

3

你可以嘗試用substitution groups這樣做:

<xs:element name="example"> 
    <xs:sequence> 
    <xs:element ref="ABCSequence" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
</xs:element> 

<xs:element name="ABCSequence" abstract="true" type="ABCSeq" /> 
<xs:complexType name="ABCSeq"> 
    <xs:complexContent> 
    <xs:sequence> 
     <xs:element name="A" type="xsd:string" /> 
     <xs:element name="B" type="xsd:string" /> 
     <xs:element name="C" type="xsd:string" /> 
    </xs:sequence> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="foo" substitutionGroup="ABCSequence" type="ABCSeq" /> 
<xs:element name="bar" substitutionGroup="ABCSequence" type="ABCSeq" /> 

我m不確定是否允許添加任意外部元素而不聲明其類型(通過xsi:type屬性),但它至少允許描述您之後的文檔類型。

+0

+1一個整潔的把戲。如果我可以讓每一位過去和將來的開發人員都參與到其XML替換中,這個答案就會獲勝,但不幸的是這是不可能的。 – clockworkgeek 2011-05-16 10:55:11

+1

如果您希望每個未來的開發人員都符合您的架構,那麼您正在失敗。我已經看到人們稱之爲XML。我已經看到他們如何「解析」它。親愛的上帝,我已經看到他們做了什麼......使用'xsi:type'註釋並將_your_解析器置於驗證模式(默認情況下通常關閉)也許是您唯一的希望。 (那問歐比萬。) – 2011-05-19 17:27:34

相關問題