2011-06-20 86 views
17

我有兩個定義不同文檔的XSD。假設A.xsd將一個元素ElementA定義爲根,並帶有一些複雜的規則。現在,B.xsd定義了一個元素ElementB,該元素應該在ElementA之間。帶有來自其他名稱空間的元素的XSD

比如我想爲ElementB這個樣子的XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<ElementB xmlns="http://example.com/namespace/for/ElementB"> 
    <foo>Bla</foo> 
    <bar>Blub</bar> 
    <ElementA xmlns="http://example.com/namespace/for/ElementA"> 
    <!-- ... --> 
    </ElementA> 
</ElementB> 

然後B.xsd看起來是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns="http://example.com/namespace/for/ElementB" targetNamespace="http://example.com/namespace/for/ElementB" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="ElementB"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="foo" type="xs:string" /> 
     <xs:element name="bar" type="xs:string" /> 

     <!-- And now I want to include ElementA somehow --> 
     <xs:element name="ElementA" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

的事情是,我真的不希望克隆因爲還有文檔,ElementAElementAB.xsd,只是以ElementA爲根(即ElementB是某種容器文檔)。

那麼,我怎樣才能允許ElementAElementB之內,而完全建立在已經存在的XSD之上呢?

回答

29

實際上有兩種不同的方式來編寫XML Schema文檔:<xs:import><xs:include>。當包含文檔的命名空間與被引用的文檔的名稱空間相同時,xs:include將用於使用,因此它不是您想要的。當需要引用所引用模式中的所有元素(或子元素)並且它們位於不同的目標名稱空間中時,xs:import更適合您的情況。這裏有一個問題的區別:What's the difference between xsd:include and xsd:import?

無論如何,回到這個具體的問題。你可能需要的是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema 
    xmlns="http://example.com/namespace/for/ElementB" 
    targetNamespace="http://example.com/namespace/for/ElementB" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    xmlns:ea="http://example.com/namespace/for/ElementA"> 
<xs:import namespace="http://example.com/namespace/for/ElementA" schemaLocation="A.xsd" /> 
<xs:element name="ElementB"> 
    <xs:complexType> 
    <xs:sequence> 
    <xs:element name="foo" type="xs:string" /> 
    <xs:element name="bar" type="xs:string" /> 
    <!-- This introduces a element named ElementA that uses the ComplexType ea:ElementA defined in A.xsd --> 
    <xs:element name="ElementA" type="ea:ElementA" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

不過你得A.xsd創建ElementA,你可以在B.xsd使用如圖所示的複雜類型。

這arcticle有一些很好的信息/例子,包括一些不同的組合性策略的討論:http://www.xfront.com/ZeroOneOrManyNamespaces.html

+0

謝謝,看起來相當不錯,我會嘗試。有一個問題,'ea:'命名空間前綴來自哪裏?或者是類型定義在'A.xsd'中獲得的'name'? – poke

+0

只需在代碼窗口上滾動到右側 - 它被引用爲xs:schema元素中的最後一個屬性:'xmlns:ea =「http://example.com/namespace/for/ElementA」'。你可以給它任何你想要的前綴,就像你可以爲默認的目標命名空間一樣(儘管每個人都會按照慣例選擇'xs'或'xsd')。 – daveaglick

+0

哦,沒有打擾到滾動那麼遠,錯過了,對不起xD也感謝您的幫助,我會盡快嘗試,併發布我的結果:) – poke

1

您可以使用<xsd:import>標記導入具有其他名稱空間的模式。

+2

你能給我如何使用上面我舉的例子一個例子嗎?您的鏈接並沒有真正解釋.. – poke

相關問題