我正在實施符合兩個外部提供的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 back,field3
是(正確地)仍然前綴。現在我不知道:
- 是什麼對比
field3
field1
和field2
之間真正的區別?爲什麼Xceres強迫我省略field1
和field2
的前綴?這是否因爲field1
和field2
確實屬於某種類型,而field3
是對某個屬性的引用? - 接收方在第二種情況下如何確定屬性
field1
和field2
屬於哪個名稱空間屬性?
(如果有人知道這是什麼描述這些規則的W3C區域經濟共同體的一部分,我是真的太感激。)
其他信息
我感到一種衝動指出這個例子的後果。如果1 field1
和field2
的前綴爲ns2
,則明確將它們確定爲ns2
-名稱空間中的屬性名稱。在情況2中,在沒有任何所述屬性名稱被加前綴的情況下,除了這些屬性屬於默認(ns1
)命名空間之外,很難得出任何其他結論。
這是爲什麼?那麼,這很重要,因爲它有效地將attributeFormDefault
轉換爲名稱空間限定符。我有嚴重的問題了解W3C委員會的意圖,因此我認爲它是一個錯誤。如果有人能夠啓發我,我會很高興!
感謝您分享您的見解!我的錯誤不包括缺少ns2:field3聲明。我現在添加了它。其實,我確實看到http://stackoverflow.com/questions/8903768/unqualified-xsd-global-attribute-references帖子,但沒有意識到它的後果。所以我猜想(元素|屬性)FormDefault(從某種意義上)隱式地控制名稱空間所屬的結論畢竟是正確的? – conciliator 2013-02-18 13:49:59
編輯:elementFormDefault沒有這種效果,因爲非前綴元素最終在默認名稱空間中。我在解釋以下內容時也遇到了一些麻煩:「默認名稱空間聲明適用於其作用域內的所有無前綴的元素名稱_默認名稱空間聲明不直接應用於屬性名稱;前綴屬性的解釋取決於它們所在的元素出現_。」 (http://www.w3.org/TR/REC-xml-names/#defaulting,我的重點)。 – conciliator 2013-02-18 14:19:08
[旁邊問題]「不知道在任何特定命名空間」和「已知不在任何命名空間」之間的區別對我來說似乎並不精妙。不知道X是否結婚,或者不知道X的薪水是多少,與X不結婚或X根本沒有薪水完全不同。誠然,Namespaces規範並沒有爲此提供很好的術語;這就是爲什麼有些人喜歡談論合格和不合格的名字,這意味着擴展形式具有非空或空名稱空間值的Qnames。 – 2013-02-18 19:30:30