2017-08-07 99 views
0

的概念,如果我的XSL有以下標題,我沒有得到任何錯誤:XML - 試圖掌握的命名空間的URI

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 

但是,如果我改變了xsl的命名空間URI ...:

<xsl:stylesheet version="1.0" xmlns:xsl="https://www.w3schools.com/xml/xml_namespaces.asp" 

...我得到一個錯誤:

javax.xml.transform.TransformerConfigurationException 

我想我不明白,一個命名空間URI的概念,因爲我雖然它可能是任何URL(不提及URNs),只要它在XML/XSL文檔中是唯一的。很明顯不是。我試圖改變URI來測試這個理論。


https://www.w3schools.com/xml/xml_namespaces.asp,我們可以看到下面的語句:

的命名空間URI不使用分析器來查找信息。

使用URI的目的是給命名空間一個唯一的名稱。

但是,公司經常使用名稱空間作爲指向包含名稱空間信息的網頁的指針。

第一條語句意味着我們不關心URI指向的網頁是什麼,爲什麼我不能將它設置爲指向我想要的任何頁面,或者甚至不存在不存在的頁面?爲什麼它必須特別是http://www.w3.org/1999/XSL/Transform

此外,以後在上述鏈路上我們可以看到:

統一資源標識符(URI)是個字符的字符串,其標識互聯網資源

因爲這一點,因爲「使用URI的目的是給命名空間一個唯一的名字」,這是否意味着一個命名空間URI必須是一個URL所以,(同樣不提這是我絕對無法捉摸的URN),這意味着我不能設置像這樣的命名空間:

xlmns:foo="A_random_but_unique_string" 

我會用這句話結束從同一個鏈接:

命名空間「 http://www.w3.org/1999/XSL/Transform「標識HTML文檔中的XSLT元素

因此,現在這意味着解析器必須使用名稱空間URL來查找信息(名稱空間的元素),否?

回答

1

它與解析URL(和下載模式)無關。儘管這兩個示例中的XML看起來都是相同的:「xsl:stylesheet」,但您的輸入被讀爲stylesheet元素(由名稱空間https://www.w3schools.com/xml/xml_namespaces.asp標識)。

Java程序需要一個stylesheet元素(由名稱空間http://www.w3.org/1999/XSL/Transform標識),但由於它無法找到它,所以會引發異常。

+0

謝謝你的回覆。 如果它甚至不需要從這個URL中提取任何信息,那麼它爲什麼期望URI http://www.w3.org/1999/XSL/Transform標識的名稱空間中的樣式表元素?我的意思是,Java程序沒有這個URL的樣式表元素的知識!無論URI如何,樣式表都是樣式表。 – Flyout

+0

因爲樣式表不是隨機/自定義格式,而是w3標準。 Java已經有了這個標準的模式定義(XSD),因此在準備轉換時,它會嘗試查看它是否符合期望。 它不知道如何從w3schools中解釋樣式表,但它知道它可以解析/解釋驗證到w3.org樣式表架構(它由唯一確定的URI ...)的XML文件。 – Fabian

+0

較短的回答:根據樣式表的XSD,帶有w3schools URI的樣式表無效。 – Fabian