2012-10-10 91 views
3

我目前正在學習XML,並已到達與多個名稱空間一起使用的XML模式的奇妙世界。XML模式中的childelements的名稱空間前綴

我的問題是當我應該也不必聲明一個名稱空間前綴。

考慮XML模式的以下片段:

<A:schema xmlns:A="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="B" 
     xmlns:B="B" 
     elementFormDefault="qualified"> 

    <A:element name="foo"> 
     <complexType>     <!-- or A:complexType?--> 
      <element name="bar" type="B:myType"/>  <!-- or A:element?--> 
     </complexType> 
    </A:element> 

    <B:complexType name="myType"> 
     <choice>       <!--or B:choice?--> 
      <element name="baz" type="string"/>  <!--or B:element?--> 
      <element name="bas" type="string"/>  <!--or B:element?--> 
     </choice> 
    </B:complexType> 

</A:schema> 

我必須指定一個命名空間前綴的節點的所有子節點上的命名空間前綴,或者這是遺傳嗎?或者A:complexTypecomplexType不同時,它的父節點的A名稱空間前綴連接到它?

回答

4

綁定前綴對名稱空間URI的綁定由子元素繼承,但元素本身不會自動放置在與其父元素相同的名稱空間中。如果他們在那裏,將無法在名稱空間中使用子項而不是的名稱空間中表示元素。在你的榜樣,所有的都是模式定義的一部分元素必須在http://www.w3.org/2001/XMLSchema命名空間(這通常映射到了xsdxs前綴):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="urn:B" 
     xmlns:B="urn:B" 
     elementFormDefault="qualified"> 

    <xs:element name="foo"> 
     <xs:complexType> 
      <xs:element name="bar" type="B:myType"/> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="myType"> 
     <xs:choice> 
      <xs:element name="baz" type="string"/> 
      <xs:element name="bas" type="string"/> 
     </xs:choice> 
    </xs:complexType> 

</xs:schema> 

唯一的例外是當你使用xmlns="..."哪些爲沒有前綴的元素定義默認命名空間,例如

<schema xmlns="http://www.w3.org/2001/XMLSchema" ...> 
    <element ...> 
     <complexType ...> 

相當於

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" ...> 
    <xs:element ...> 
     <xs:complexType ...> 

type="B:myType"是正確的,因爲它指的是一個名爲myType在架構的targetNamespace的類型,你又映射到前綴B有。

+1

我想你已經誤解了命名空間是如何在這裏工作的。 '元素(在XMLSchema名稱空間中)是模式的一條指令,用於在模式的targetNamespace中聲明一個名爲'myType'的類型(即'urn:B') 。所以要說一個元素應該是'{urn:B} myType'類型的,你可以將一個前綴('B')映射到這個名稱空間URI,然後說''。 –