Like Share Discussion Bookmark Smile

J.J. Huang   2022-11-17   XML 2.延伸介紹   瀏覽次數:次   DMCA.com Protection Status

XML教學 | XML Namespaces

XML Namespaces是什麼?

XML Namespaces(命名空間)提供了一種避免元素名稱衝突的方法。

名稱衝突:在XML中,元素名稱由開發人員定義。當試圖混合來自不同XML應用程式的XML檔時,這通常會導致衝突

衝突範例:

如果將這兩個XML片段加在一起,就會出現名稱衝突。
兩者都包含一個<table>元素,但這些元素具有不同的內容和含義。

使用者或XML應用程式將不知道​​如何處理這些差異。

  • XML內有HTML表格訊息。
    1
    2
    3
    4
    5
    6
    <table>
    <tr>
    <td>Apples</td>
    <td>Bananas</td>
    </tr>
    </table>
  • XML包含有關桌子(一件家具)的訊息。
    1
    2
    3
    4
    5
    <table>
    <name>African Coffee Table</name>
    <width>80</width>
    <length>120</length>
    </table>

使用前綴解決名稱衝突

使用名稱前綴可以輕鬆避免XML中的名稱衝突。
以下XML使用前綴包含有關HTML表格和一件家具的訊息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<root>

<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>

</root>

注意到這邊並沒有定義「前綴」也就是命名空間的聲明,這樣直接使用瀏覽器開啟會有錯誤。

1
2
3
4
5
6
7
8
This page contains the following errors:
error on line 2 at column 9: Namespace prefix h on table is not defined
error on line 3 at column 8: Namespace prefix h on tr is not defined
error on line 4 at column 10: Namespace prefix h on td is not defined
error on line 9 at column 9: Namespace prefix f on table is not defined
error on line 10 at column 10: Namespace prefix f on name is not defined
error on line 11 at column 11: Namespace prefix f on width is not defined
error on line 12 at column 12: Namespace prefix f on length is not defined

聲明和引用命名空間

XML中使用前綴時,必須為前綴定義命名空間。
命名空間可以由元素開始標記中的xmlns屬性定義。

  • 命名空間使用元素的屬性來聲明:
    1
    xmlns:{前綴}="{URI}"
  • 範例:
    1
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    • xmlns是使用專門用來聲明命名空間的保留字。
    • xhtml是命名空間的前綴。
    • http://www.w3.org/1999/xhtml(頁面存檔備份,存於網際網路檔案館),是命名空間的唯一標識符,是一個IRI引用,但通常是一個統一資源標誌符(URI)引用。

註:簡單來說,命名空間的聲明就是將一個前綴與一個URI關聯起來。


  • 聲明的方式有兩種。
    • 命名空間在XML各個元素中聲明:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      <root>

      <h:table xmlns:h="http://www.w3.org/TR/html4/">
      <h:tr>
      <h:td>Apples</h:td>
      <h:td>Bananas</h:td>
      </h:tr>
      </h:table>

      <f:table xmlns:f="https://www.w3schools.com/furniture">
      <f:name>African Coffee Table</f:name>
      <f:width>80</f:width>
      <f:length>120</f:length>
      </f:table>

      </root>
    • 命名空間在XML根元素中聲明:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      <root xmlns:h="http://www.w3.org/TR/html4/"
      xmlns:f="https://www.w3schools.com/furniture">

      <h:table>
      <h:tr>
      <h:td>Apples</h:td>
      <h:td>Bananas</h:td>
      </h:tr>
      </h:table>

      <f:table>
      <f:name>African Coffee Table</f:name>
      <f:width>80</f:width>
      <f:length>120</f:length>
      </f:table>

      </root>
      第一個<table>元素中的xmlns屬性為h:前綴提供了一個合格的命名空間。
      第二個<table>元素中的xmlns屬性為f:前綴提供了一個限定的命名空間。
      當為元素定義命名空間時,具有相同前綴的所有子元素都與相同的命名空間相關聯。

注意:解析器不使用命名空間URI來查找訊息。使用URI的目的是為命名空間提供唯一的名稱。但是,公司經常將命名空間用作指向包含命名空間訊息的網頁的指針。


預設命名空間

為一個元素定義一個預設命名空間可以避免在子元素中使用前綴

  • 語法:

    1
    xmlns="{URI}"
  • 範例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <root>

    <table xmlns="http://www.w3.org/TR/html4/">
    <tr>
    <td>Apples</td>
    <td>Bananas</td>
    </tr>
    </table>

    <table xmlns="https://www.w3schools.com/furniture">
    <name>African Coffee Table</name>
    <width>80</width>
    <length>120</length>
    </table>

    </root>

實際使用命名空間

  • 講半天的「命名空間」,他到底會運用在哪?XSLT就有實際使用了。
    • XSLT是一種可用於將XML文檔轉換為其他格式的語言。
    • 命名空間"http://www.w3.org/1999/XSL/Transform"標識HTML檔中的XSLT元素:
  • 以下的XSLT CodeXML檔,是用於將XML轉換為HTML的檔。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?xml version="1.0" encoding="UTF-8"?>

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

    <xsl:template match="/">
    <html>
    <body>
    <h2>My CD Collection</h2>
    <table border="1">
    <tr>
    <th style="text-align:left">Title</th>
    <th style="text-align:left">Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
    <td><xsl:value-of select="title"/></td>
    <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
    </table>
    </body>
    </html>
    </xsl:template>

    </xsl:stylesheet>
  • 他的行為流程如下:


範例執行效果:
https://www.w3schools.com/xml/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog

註:這邊不會特別介紹XSLT語法的使用和教學。

結語

此章節的教學重點是「Namespaces」,其它延伸提到的部份像是XSLT在此不會深入做說明。
下一章節將會介紹XML XPath的部份。


註:以上參考了
w3resource.com - XML Namespaces
w3resource.com - XSLT Introduction
維基百科-XML
維基百科-XSLT
Family with 220 icons by inipagi