2017-08-22 32 views
0

我有一個xsd文件,定義了xml模式,第二個包含擴展。我需要這樣的:使用兩個模式時xml中的命名空間

<ns:Node> 
    <InnerNode> 
     <Value1>value 1</Value1> 
     <Value2>value 2</Value2> 
    </InnerNode> 
</ns:Node> 

InnerNode的定義是在主文件中,在擴展名中的節點。我的擴展定義如下所示:

<xs:element name="Node"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="InnerNode" type="InnerNodeType"/> 
     </xs:sequence> 
    </xs:complexType>  
</xs:element> 

命名空間在兩種模式中都有定義,我有兩種導入。當我使用示例xml驗證架構時,出現錯誤,並且InnerNode應該具有名稱空間,而不僅僅是Node元素。我嘗試使用帶有非限定值的表單屬性,但它沒有幫助 - 驗證器(XMLSpy)建議插入空的xmlns屬性。

是否可以定義不需要名稱空間(某些缺失屬性)的InnerNode元素?

編輯: 我沒有提到的是,在主XSD文件我用的是節點類型爲更大結構的一部分(這可能使得它更復雜一點):

<OuterNode> <!-- defined in main xsd --> 
    <ns:Node> <!-- defined in imported --> 
     <InnerNode> <!-- defined in main --> 
      <Value1>value 1</Value1> 
      <Value2>value 2</Value2> 
     </InnerNode> 
    </ns:Node>  
</OuterNode> 

是它有可能做到這一點?

+0

一個小的技術性:你確實有一個架構由兩個模式文檔。但別擔心,沒有多少人知道這一點。 –

回答

0

我已經進行了一些研究,得到了以下結果:

如果添加在你的主方案將elementFormDefault =「不合格」 ,並在同一時間,你添加的形式=「不合格」到的定義元素InnerNode的擴展方案

<xs:element name="Node"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="InnerNode" form="unqualified" type="InnerNode"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

它會正常工作和驗證。

我已附加下面的方案的實例:

main.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.main.org" targetNamespace="http://www.main.org" elementFormDefault="unqualified"> 
    <xsd:complexType name="InnerNodeType"> 
    <xsd:sequence> 
     <xsd:element name="Value1" type="xsd:string"/> 
     <xsd:element name="Value2" type="xsd:string"/> 
    </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

additional.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.additional.org" targetNamespace="http://www.additional.org" 
      xmlns:ext="http://www.main.org" elementFormDefault="qualified"> 
    <xsd:import schemaLocation="main.xsd" namespace="http://www.main.org"/> 
    <xsd:element name="Node"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="InnerNode" type="ext:InnerNodeType" form="unqualified"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+0

感謝您的回覆。 我試過這個,但它不能解決我的問題 - 需要xmlns =「」屬性才能通過驗證。 – owczarek

+0

希望我正確理解問題。由於我已經創建了兩個簡單的xsd:主要定義了InnerNodeType,而另一個定義了Node元素。我從這個xsd得到了xml。它看起來像你已經附加 –

+0

我不能使用form =「unqualified」屬性擺脫xmlns =「」屬性。我的情況更復雜,我忘記提及外部結構。請看我編輯的問題。 – owczarek

1

如果InnerNode元件中的元件聲明中定義在一個單獨的模式文檔,那麼您需要ref="InnerNode"而不是name="InnerNode"。 (使用name =創建一個允許任何內容的本地元素聲明)。

替代地,如果InnerNode元素的類型的單獨模式文檔中被定義,則可以使用name="InnerNode" type="InnerNodeType"

無論哪種方式,如果其他模式文檔的目標命名空間不存在(即,它是一個NO-命名空間模式文檔),那麼「type」或「ref」的值需要是一個無命名空間QName。這意味着包含元素在範圍內不能有默認的名稱空間。但是你的確如此:xmlns="http://www.additional.org"。因此,你需要用undeclaration取消此:

<xsd:element ref="InnerNode" xmlns=""/> 

<xsd:element name="InnerNode" form="unqualified" type="InnerNodeType" xmlns=""/> 
+0

謝謝您的重播。我試過這個,但我仍然必須在xml中有xmlns =「」屬性。有什麼辦法可以解決這個問題嗎? – owczarek

+0

如果存在具有名稱空間聲明的外部元素,其形式爲'xmlns =「something.else」',那麼只需要XML實例中的'xmlns =「」'。 –

+0

所以在我的情況下我的XML需要看起來像: 值1 值2 ?是對的嗎? – owczarek