2016-02-05 179 views
1

我知道這是在C++中使用的命名空間功能和C. 但我不明白,在XSLT這行代碼:XSL - 什麼是命名空間?它是什麼?

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 

這是什麼在那裏?如果我錯過了這個,會發生什麼? (如果我刪除這一行什麼也沒有發生)...... 而這是什麼指向?`

我讀過一些有關此帖子在W3Cschools ...但我還是沒有 瞭解...

在此先感謝。

+0

http://www.w3schools.com/xml/xml_namespaces.asp。關於谷歌搜索的命名空間有一百萬個教程。 – OldProgrammer

+0

以及爲什麼我需要XSLT中的命名空間呢?我剛剛得到了一個XSLT ...我猜,XML和XSLT之間可能沒有衝突。 –

+0

@ H.Senkaya:除非您的XSLT生成XML ... – choroba

回答

4

這個問題值得更好的解釋。

這裏是table命名的元素:

<table material="wood" 
     legs="4" shape="rectangle" type="dining"/> 

從它的4個屬性很顯然,這種描述餐桌四條腿的值,長方形形狀。

這裏是另一個table元素

<table name="Product"> 
    <columns> 
    <column name="id"/> 
    <column name="name" type="string"/> 
    <column name="price" type="decimal"/> 
    <column name="date-produced" type="date"/> 
    </columns> 
    <rows> 
    <row id="1" name="bike" price="300" quantity="2" 
       date-produced="2013-08-12"/> 
    </rows> 
</table> 

這顯然不是一件傢俱,但可能是一個關係數據庫表

我們看到兩個「表格」元素有不同的含義和沒有共同之處 - 它們碰巧具有相同的名稱,但它們屬於不同的詞彙表

這裏有元素名稱的一些例子可以屬於不同的詞彙

<furniture:table/> 
<sql:table/> 
<resataurant:table/> 
<html:table/> 

<sql:column/> 
<architecture:column/> 
<table:column> 

<css:style/> 
<architecture:style/> 
<fashion:style/> 

在這裏,我們有三個不同的元素名稱:「表「,」列「和」樣式「,每個屬於> 1個詞彙表。

有由這些元件表示8個不同的詞彙表:

  1. furnituresqlrestauranthtml爲名稱table
  2. sqlarchitecturetable的名稱column
  3. cssarchitecturefashion爲名稱style

命名空間的用途是識別給定名稱所屬的詞彙。換句話說,可以區分屬於不同詞彙表的兩個相同名稱。

下面是一個典型命名空間聲明

<的xsl:樣式表版本= 「1.0」
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">

它一個命名空間前綴到相關聯一個名稱空間URI(統一R資源標識符)。

這個命名空間聲明的效果是名稱:xsl:stylesheet屬於與命名空間URI字符串「http://www.w3.org/1999/XSL/Transform」

不同的命名空間前綴的命名空間可以關聯到同一個命名空間URI - 即使在同一個XML文件。

但是,命名空間URI必須是全局唯一的:XSLT命名空間始終是相同的字符串,無論使用哪個前綴。

前綴

  • 是遵循屬性名稱的部分"xmlns:"
  • 不能包含字符":"
  • 如果屬性名稱只是xmlns那麼前綴「」 (空串)

NS U RI

  • 可以是任何字符串:"^%$23rt""http://myComp.com""my:my"
  • 必須是唯一的
  • 可能是有意義的URL。
  • 如果有意義的URL,這並不需要包含該URL的頁面存在。 XML處理器不會發出任何HTTP請求來訪問此URL。

請注意

  • 的命名空間URI必須是唯一的:這是一個命名空間最重要的要求。
  • 可能(但沒有必要)是一個有意義的URL - 更重要的是字符串的唯一性。
  • 如果 NS URI是一個有意義的URL,這並不要求包含此URL的頁面應該存在。 沒有爲NS URI發出HTTP請求。

Common misconceptions


現在,爲了回答具體問題:

我不明白這行代碼在XSLT: xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

這是什麼那裏?

這是XSLT名稱空間命名空間聲明定義XSLT詞彙

其目的是爲了消除歧義任何元素和屬性在這個名字空間從任何其他出現次數名稱相同的名稱,屬於其他詞彙表(或不屬於任何詞彙表(屬於「空」的詞彙表)。

如果我錯過了這個,會發生什麼?

在情況下,存在在XML文檔中沒有指定XSLT命名空間聲明,則:

  • XSLT處理器不會發現任何<xsl:stylesheet>聲明,指令,元素或屬性其理解。它不會做任何工作,並可能會報告錯誤。
  • 如果沒有帶前綴「xsl」的名稱空間聲明,但在文檔中存在包含此前綴的元素(或屬性)名稱,則即使XML解析器也會產生錯誤,表明輸入不是一個好的形式的XML文檔。

這是什麼指向?

如前所述,namespace-uri可以是任何字符串,可能不一定是語法上有效的URL。如果是一個語法上有效的URL,則沒有義務確定將有HTTP服務器爲使用此URL的任何HTTP請求提供HTTP響應。

而XSLT處理器絕對不會發出任何這樣的HTTP請求 - 任何人都可以通過斷開所有網絡和執行任何XSLT轉換來證明這一點 - 轉換仍然會產生結果。

但是,在這種特殊情況下,如果你嘗試在瀏覽器這個網址,你會看到,W3C一直友好其衆多的用戶和頁面實際放送:

The W3C "XSLT-Namespace" page

我讀過有關這W3Cschools一些帖子...但我還是沒有 瞭解...

W3Schools的是不被認爲是關於XML/XSLT/XPath的一個很好的資源 - 作爲一個解釋T:W3Fools

唯一有關XML,XML命名空間和XSLT權威源是其相應的規範:http://www.w3.org/TR/2008/REC-xml-20081126/http://www.w3.org/TR/2006/REC-xml-names-20060816/,和https://www.w3.org/TR/1999/REC-xslt-19991116(後者是XSLT 1.0規範 - 對XSLT 2.0存在單獨的規格和XSLT 3.0)

但是,W3C規範並不是爲了用戶友好而編寫的。如果有人想了解更多關於XSLT和XML的知識,我會在Pluralsight推薦我的視頻課程:XSLT 2.0 and 1.0 Foundations - 本課程的第二個模塊詳細介紹了XML名稱空間的概念。

+0

感謝您的努力。永遠不要讀更好的解釋!在你的那篇文章之後,我明白了命名空間背後的真正目的! –

+0

@ H.Senkaya,不客氣。 –

2

什麼也沒有發生,如果我刪除這一行

嗯,這不是真的。如果刪除名稱空間聲明,則樣式表將停止工作。事實上,它不再是XSLT樣式表。

XSLT處理器使用名稱空間來區分XSLT指令(處理器必須執行)和其他元素(如文字結果元素(將被複制到輸出樹))。