2013-03-12 80 views
3

我在玩XML模式並嘗試生成一個使用它的簡單有效文檔。無法編譯W3C提供的XSD架構;無法解析「ID」?

模式XSD由W3C提供,所以我無法想象任何事情實際上都是錯誤的。但xmllint命令行以及任何數量的贈品在線驗證器上抱怨實際XSD(不是我的測試文檔)有:

The QName value '{http://www.w3.org/XML/1998/namespace}id' does not resolve to a(n) attribute declaration. 

注意,它無法解決id類型/名稱,它是基於XML的東西。我不是一個XML大師,所以我可能會在這裏錯過一些關於名稱空間/鏈接的明顯內容。這對我的測試文檔不是問題,因爲即使是一個簡單的測試文檔在XSD編譯位中也失敗了。

Here's the XSD file。下面是一個簡單的測試文檔:

<?xml version="1.0" encoding="UTF-8"?> 
<ink xmlns="http://www.w3.org/2003/InkML" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.w3.org/TR/2011/REC-InkML-20110920/inkml.xsd"> 
</ink> 

但是儘量爲我可能,我不能讓xmllint或網上驗證,甚至讓過去的XSD解析/編譯階段,因爲XML ID類型是有點靠不住。

我對XML的理解是否不正確?我在SO(與另一個站點)上詢問,因爲最終這是爲了理解XML規範和依賴關係來編寫和驗證文檔。我會歡迎代碼片段做正確的事情,無論正確的事情是什麼。

想法?謝謝。

回答

4

您指向的模式包含一個導入語句到一個衆所周知的XML模式。

<xsd:import namespace="http://www.w3.org/XML/1998/namespace" id="xml" /> 
<!-- schemaLocation="http://www.w3.org/2001/xml.xsd" --> 

正如你所看到的,不像低於此另一個...

<xsd:import namespace="http://www.w3.org/1998/Math/MathML" schemaLocation="inkml-mathml2-subset.xsd" id="mathml" /> 

前者不爲您提供一個schemaLocation屬性。

如果拿http://www.w3.org/2001/xml.xsd URL並粘貼到瀏覽器中,經過一段時間(或沒有,這取決於這些鏈接節流),你應該看到xml.xsd - 在你的情況下,缺少的部分;如果您看到HTML而不是純XML,請切換到源視圖以查看它,這意味着您的瀏覽器會自動應用../2008/09/xsd.xsl樣式表。

我相信,如果您現在修改第一次導入以包含schemaLocation屬性,則大多數驗證器現在都可以工作。

這個導入是最有可能的「懸掛」,作爲一種安全措施,以確保人們不會一次又一次地訪問W3C網站,因爲它被認爲是衆所周知的XSD。期望值(至少從我以前看到的情況來看)是XSD處理器自動將這些衆所周知的名稱空間引用解析爲某些本地/嵌入式XSD的副本。顯然,你嘗試過的處理器默認不會這樣做。

QTAssistant(我與它相關聯)確實解決了這個問題,所以如果你在本地下載這兩個XSD,然後按原樣加載它們,每一個都可以很好地驗證。

如果您不想修改XSD - 例如當您真的想要從遠程URL加載XSD時,解決方案是向XSD處理器提供某種目錄信息,以幫助它解決問題xml.xsd。對於xmllint,請使用--catalogs選項。我建議使用xml.xsd的本地副本。瀏覽系統中已有的目錄(如果設置了$ SGML_CATALOG_FILES,否則/ etc/xml /目錄),也許可以使用現有的目錄。

+0

釘住它;說得通。非常感謝Petru。 – 2013-03-13 18:00:37