2015-01-07 30 views
1

我想了解一個XSD架構。我無法發佈原始模式,但它有點如下。 我的問題是,我不明白爲什麼相同的名稱空間(http://www.test.com/test)被引用兩次,一次使用前綴,一次沒有前綴。這有效嗎?如果是,它的用途是什麼?XSD架構 - 多次使用相同的命名空間

另外,當爲這個XSD生成XML時,我會使用前綴還是不使用?

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.test.com/test" 
xmlns:pre="http://www.test.com/test" targetNamespace="http://www.test.com/test" 
elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:complexType name="StudentType"> 
    <xs:sequence> 
     <xs:element name="studentId" type="xs:token" /> 
     <xs:element name="firstName" type="xs:token"/> 
     <xs:element name="middleName" type="xs:token" minOccurs="0"/> 
     <xs:element name="lastName" type="xs:token"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:element name="students"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="student" type="StudentType" minOccurs="0" maxOccurs="unbounded"> 
      <xs:unique name="uniqueStudentId"> 
      <xs:selector xpath="pre:studentId"/> 
      <xs:field xpath="."/> 
      </xs:unique> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+1

重要的是要認識到,前綴只在單個XML片段中有意義,並且您不必強制使用XSD使用的相同前綴。所有'Hello','你好'和'你好'是完全一樣的東西,從信息角度。 –

+0

感謝您分享此內容。 – kapd

回答

1

沒有前綴提供命名空間成爲默認名稱空間,除非他們有資格明確不同的下面,它會自動屬於該命名空間的所有元素。

現在前綴命名空間 - 我看不到任何理由爲什麼它不應該被允許。至於它的目的,我不確定,但我猜想它可能與其他覆蓋命名空間的可能性有關。

我想再次強調的是,這是炒作,但是想象一下,你有這樣的事情:

<root xmlns="http://my.default.ns" xmlns:def="http://my.default.ns"> 
    <class id="1"> 
     <student> 
      This will automatically belong to https://my.default.ns 
     </student> 
    </class> 
    <class id="2" xmlns="http://especially.bright.pupils"> 
     <student> 
      This will belong to http://especially.bright.pupils 
     </student> 
     <def:student> 
      NOTE: THIS student should still belong to https://my.default.ns, 
      since the element prefix relates to the namespace in the root element, 
      which has not been overridden. The DEFAULT namespace (without prefix), 
      has been overridden at this point, by the namespace defined in the 
      second <class>-element. 
     </def:student> 
    </class> 
</root> 

在這裏,用<def:student>「默認」學生明確命名由一個新的被覆蓋停止它下面是默認名稱空間。

請注意,如果下面重新定義了xmlns:def,它仍然可以被覆蓋 - 它將不會被默認命名空間覆蓋。響應


更新下面評論(希望我理解正確你的問題):

命名空間本身是由URI定義,所以它是同一個命名空間;這兩位引用這個命名空間做的,就是明確指定:

  • 此點下方的所有元素都將默認屬於命名空間http://www.test.com/test(即除非它們被覆蓋,還是有一定的前綴鏈接到不同的命名空間),低於這個點
  • 要素,有前綴pre:將屬於命名空間http://www.test.com/test

換句話說,這是兩個(完全有效)的命名空間聲明,這只是碰巧涉及相同的命名空間。

請記住,命名空間本質上是只是名稱,它用於排序/組織可能看起來完全相同的東西。

至於目的TargetNamespaces,請參閱this question

+0

感謝您的回覆。那麼,理想情況下,在這個XSD的背景下是這兩個獨立的命名空間?或者它是相同的命名空間?根據我的理解,只有當某些東西被「pre」限定時,這些命名空間纔是不同的名稱空間,否則它將位於該命名空間中,否則它將處於默認狀態。另外,你說沒有前綴的命名空間是默認的命名空間。我想這是根據「targetNamespace」屬性決定的,對嗎?對不起,我有限的知識。 – kapd

+0

@kapd在我的答案底部看到我的更新。 – Kjartan

+0

再次感謝您的回答。還有一個疑問,雖然不相關,但在這種情況下targetNamespace屬性意味着什麼。 – kapd

2

這類事情在XSD中很常見。

targetNamespace定義架構文檔中定義的頂級元素,類型等的名稱空間。這些聲明的「name」屬性是一個本地名稱(不能加前綴),定義關聯名稱空間的唯一方法是使用targetNamespace聲明。

xmlns =「http://www.test.com/test」聲明影響未加前綴的名稱引用,例如type =「StudentType」:這隱含地是對本地名稱類型的引用「學生類型「在命名空間」http://www.test.com/test「中。

xmlns:pre =「http://www.test.com/test」聲明會影響具有顯式前綴「pre」的名稱引用。這是必需的,因爲該模式在xs:selector和xs:field內包含XPath表達式。 XPath規範說,如果沒有前綴,名稱就是在沒有名稱空間中引用一個名稱,所以引用名稱空間中名稱的唯一方法是分配一個前綴。

因此,您有三個聲明影響架構文檔中出現的不同類型的名稱。

+0

感謝您的回覆。這進一步澄清了我的疑惑。 – kapd

相關問題