2015-05-15 130 views
1

我從xsd驗證中獲得了某種精神分裂行爲。此link顯示了聯機模式驗證程序中的xml和xsd +錯誤。當我與xmllintxsd驗證抱怨同時丟失屬性和錯誤屬性

xmllint --noout --nonet --schema devhelp2.xsd tester.devhelp2 

運行這個本地我得到了類似的警告:

tester.devhelp2:5: element sub: Schemas validity error : Element '{urn:devhelp}sub', attribute 'name': The attribute 'name' is not allowed. 
tester.devhelp2:5: element sub: Schemas validity error : Element '{urn:devhelp}sub', attribute 'link': The attribute 'link' is not allowed. 
tester.devhelp2:5: element sub: Schemas validity error : Element '{urn:devhelp}sub': The attribute '{urn:devhelp}name' is required but missing. 
tester.devhelp2:5: element sub: Schemas validity error : Element '{urn:devhelp}sub': The attribute '{urn:devhelp}link' is required but missing. 

但是這有一個暗示,有一些錯誤的命名空間。

PS:

我可以使它通過完全丟棄的xmlns(從zvon.org截取)驗證。見here for the new online validator example - 我仍然想了解它,是不是有一個解決方案保留xmlns?

+0

我也嘗試添加attributeFormDefault =「合格」我的XSD,因爲誤差約爲屬性,但它不會改變任何東西。 – ensonic

+0

您的意圖是將屬性放在'urn:devhelp'命名空間中嗎? – kjhughes

+0

是的。我想'urn:devhelp'是文檔中的默認命名空間。 – ensonic

回答

3

精簡例如

我你的榜樣減少到以下XML架構。

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="urn:devhelp" 
    xmlns="urn:devhelp" 
    elementFormDefault="qualified"> 

    <xsd:attribute name="title" type="xsd:string"/> 

    <xsd:element name="book"> 
    <xsd:complexType> 
     <xsd:attribute ref="title" use="required"/> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

這個XML

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<book xmlns="urn:devhelp" title="tester Reference Manual"/> 

驗證錯誤

無效。
錯誤 - 第2行,第60行:org.xml.sax.SAXParseException; lineNumber:2; columnNumber:60; cvc-complex-type.3.2.2:屬性'title'不允許出現在元素'book'中。
錯誤 - 第2行,第60行:org.xml.sax.SAXParseException; lineNumber:2; columnNumber:60; cvc-complex-type.4:屬性'title'必須出現在元素'book'上。

矛盾的驗證錯誤很好地表明命名空間有問題。

規格:在XML命名空間1.0

規格規定

6.2 Namespace Defaulting

...默認命名空間聲明並不直接適用於屬性 名稱;前綴屬性的解釋由它們出現的元素決定。

第一個條款解釋了屬性不會繼承元素的默認名稱空間聲明。因此/book/@title沒有名稱空間,而您的XML模式需要名稱空間urn:devhelptitle屬性。

第二個條款很棘手,因爲這很容易讓人誤解。它只是說屬性不需要名稱空間,因爲它們可以根據周圍的元素進行不同的使用。

的例子還提到,行爲:

6.3 Uniqueness of Attributes

......然而,每個以下是合法的,第二是因爲默認的命名空間並不適用於屬性名稱:
。 ...
< x xmlns:n1 =「http://www.w3.org」xmlns =「http://www.w3.org」>
    <好a =「1」b =「2 「/>
    <好= 「1」 N1爲:a = 「2」/>
< /X>

明確設置該屬性的名稱空間。

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<book xmlns="urn:devhelp" xmlns:mine="urn:devhelp" mine:title="tester Reference Manual"/> 

或避免complexType外面屬性定義:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:mine="urn:devhelp" 
    targetNamespace="urn:devhelp" 
    elementFormDefault="qualified"> 

    <xsd:element name="book"> 
    <xsd:complexType> 
     <xsd:attribute name="title" type="xsd:string" use="required"/> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+0

我在家裏上班的時候遇到了類似的解決方案。我不知道你知道這個理由。我絕對想避免頂層元素的mine:namespace。但是不能使用會錯過我可以定義的通用屬性:/ – ensonic

+0

@ensonic:我不知道從給定名稱空間中排除屬性的原因。可能這是一種遺產,當他們意識到不一致時,他們並沒有擺脫它。 –

+0

@ensonic:你可以嘗試將這些屬性外包到另一個XSD中,並將它們導入爲像'而沒有命名空間。我不確定這是否有效,現在我沒有環境來檢查。 –