2013-02-18 68 views
1

我正在實施符合兩個外部提供的XSD的XML解決方案。首先,我們ns1.xsd:理解特定XSD驗證結果時遇到問題(Xceres)

<schema xmlns:ns1="http://www.test.com/ns1" 
     xmlns:ns2="http://www.test.com/ns2" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" 
     xmlns="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://www.test.com/ns1" 
     elementFormDefault="qualified"> 
    <import namespace="http://www.test.com/ns2" 
     schemaLocation="http://www.test.com/ns2.xsd"/> 
    <element name="Root"> 
     <complexType> 
      <sequence> 
       <element name="Child" type="ns2:ChildType" 
         minOccurs="0"/> 
      </sequence> 
     </complexType> 
     <attribute ref="ns2:field3" use="optional"/> 
    </element> 
</schema> 

和ns2.xsd:

<schema xmlns:ns2="http://www.test.com/ns2" xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.test.com/ns2" elementFormDefault="qualified" attributeFormDefault="qualified"> 
    <complexType name="ChildType"> 
     <attribute name="field1" type="string" use="optional"/> 
     <attribute name="field2" type="string" use="optional"/> 
    </complexType> 
    <attribute name="field3" type="string"/> 
</schema> 

在在liquid-technologies.com有一個tutorial showing how XSDs using referenced types應予執行。遵循該邏輯,我得到:

<?xml version="1.0" encoding="UTF-8"?> 
<Root xmlns="http://www.test.com/ns1" 
     xmlns:ns2="http://www.test.com/ns2" 
     ns2:field3="test"> 
    <Child ns2:field1="test" ns2:field2="test"/> 
</Root> 

它使用Xerces 2.11.0驗證。如果我在ns2.xsd改變attributeFormDefault="unqualified"我不得不放棄了實施中的命名空間前綴得到它來驗證:

<?xml version="1.0" encoding="UTF-8"?> 
<Root xmlns="http://www.test.com/ns1" 
     xmlns:ns2="http://www.test.com/ns2" 
     ns2:field3="test"> 
    <Child field1="test" field2="test"/> 
</Root> 

正如我asked a while backfield3是(正確地)仍然前綴。現在我不知道:

  1. 是什麼對比field3field1field2之間真正的區別?爲什麼Xceres強迫我省略field1field2的前綴?這是否因爲field1field2確實屬於某種類型,而field3是對某個屬性的引用?
  2. 接收方在第二種情況下如何確定屬性field1field2屬於哪個名稱空間屬性?

(如果有人知道這是什麼描述這些規則的W3C區域經濟共同體的一部分,我是真的太感激。)

其他信息

我感到一種衝動指出這個例子的後果。如果1 field1field2的前綴爲ns2,則明確將它們確定爲ns2-名稱空間中的屬性名稱。在情況2中,在沒有任何所述屬性名稱被加前綴的情況下,除了這些屬性屬於默認(ns1)命名空間之外,很難得出任何其他結論。

這是爲什麼?那麼,這很重要,因爲它有效地將attributeFormDefault轉換爲名稱空間限定符。我有嚴重的問題了解W3C委員會的意圖,因此我認爲它是一個錯誤。如果有人能夠啓發我,我會很高興!

回答

1

未加前綴的屬性通常被視爲不在名稱空間中。它們不在默認名稱空間中。 (我通常說,因爲有些人喜歡不同的解釋,就像他們在一個未指定的名稱空間,但這種區別對我來說太微妙了。)

當你說attributeFormDefault =「unqualified」,local- ns2的模式文檔中聲明的屬性將不在名稱空間中,這意味着它們必須出現在沒有前綴的實例中。

至於ns2:field3,這有點奇怪,因爲似乎沒有對該屬性的聲明。但是如果有的話,它必須是一個全局屬性聲明,並且全局屬性總是進入包含模式文檔的目標名稱空間。

+0

感謝您分享您的見解!我的錯誤不包括缺少ns2:field3聲明。我現在添加了它。其實,我確實看到http://stackoverflow.com/questions/8903768/unqualified-xsd-global-attribute-references帖子,但沒有意識到它的後果。所以我猜想(元素|屬性)FormDefault(從某種意義上)隱式地控制名稱空間所屬的結論畢竟是正確的? – conciliator 2013-02-18 13:49:59

+0

編輯:elementFormDefault沒有這種效果,因爲非前綴元素最終在默認名稱空間中。我在解釋以下內容時也遇到了一些麻煩:「默認名稱空間聲明適用於其作用域內的所有無前綴的元素名稱_默認名稱空間聲明不直接應用於屬性名稱;前綴屬性的解釋取決於它們所在的元素出現_。」 (http://www.w3.org/TR/REC-xml-names/#defaulting,我的重點)。 – conciliator 2013-02-18 14:19:08

+0

[旁邊問題]「不知道在任何特定命名空間」和「已知不在任何命名空間」之間的區別對我來說似乎並不精妙。不知道X是否結婚,或者不知道X的薪水是多少,與X不結婚或X根本沒有薪水完全不同。誠然,Namespaces規範並沒有爲此提供很好的術語;這就是爲什麼有些人喜歡談論合格和不合格的名字,這意味着擴展形式具有非空或空名稱空間值的Qnames。 – 2013-02-18 19:30:30