Пространства имен XML

XML命名空间提供了一种避免元素命名冲突的方法。

命名冲突

在XML中,元素名称由开发者定义。当两个不同的文档使用相同的元素名时,就会发生命名冲突。

这个XML文档携带着某个表格中的信息:

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

这个XML文档包含有关桌子(一件家具)的信息:

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

假如这两个XML文档被一起使用,由于两个文档都包含带有不同内容和定义的<table>元素,就会发生命名冲突。

用户或XML应用程序将无法确定如何处理这类冲突。

使用前缀来解决名称冲突

使用名称前缀可以轻松避免XML中的名称冲突。

这个XML包含有关HTML表格和一件家具的信息:

<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>

现在,命名冲突不存在了,这是由于两个文档都使用了不同的名称来命名它们的<table>元素(<h:table><f:table>)。

通过使用前缀,我们创建了两种不同类型的<table>元素。

XML命名空间 - xmlns属性

При использовании префиксов в XML, необходимо определить префикс.Пространства именПространства имен (Namespaces)

Пространства имен могут быть определены через xmlns атрибут для определения.

Декларация пространства имен использует такую грамматику: xmlns:префикс="URI"。

<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.codew3c.com/furniture">
  <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: Префикс предоставляет ограниченное пространство имен.

Если для элемента определено пространство имен, то все подэлементы с тем же префиксом связаны с тем же пространством имен.

Пространства имен также могут быть объявлены в корневом элементе XML:

<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="https://www.codew3c.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>

Внимание:Парсер не использует URI пространства имен для поиска информации.

Цель использования URI — просто предоставить уникальное имя для пространства имен.

Однако, многие компании часто используют имена пространств в качестве указателей на существующие веб-страницы, содержащие информацию о пространстве имен.

Единый ресурсоопределяющий identifier (URI)

Единый ресурсоопределяющий identifier (Uniform Resource Identifier,URI) — это строка, которая идентифицирует ресурс Интернета.

Самый распространенный URI —Единый ресурсоопределяющий locator (Uniform Resource Locator,URL) — это адрес интернет-домена.

Другой менее распространенный тип URI —Единое имя ресурса (Uniform Resource Name,URN)。

Дефолтное имя пространства (Default Namespaces)

Определениеdefaultnamespace для элемента позволяет нам избежать использования префикса во всех подэлементах.

Используйте следующую грамматику:

xmlns="namespaceURI"

Этот документ XML содержит информацию о таблице HTML:

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

Этот XML содержит информацию о предмете мебели:

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

Реальное применение пространств имен

XSLT - это язык, который можно использовать для преобразования документов XML в другие форматы.

Ниже приведен документ XML, используемый для преобразования XML в HTML.

Если вы внимательно изучите следующий этот документ XSL, вы увидите, что большинство тегов - это теги HTML.

Все не HTML-теги имеют префикс xsl и обозначены этим пространством имен: "http://www.w3.org/1999/XSL/Transform":

Пространство имен "http://www.w3.org/1999/XSL/Transform" обозначает элементы XSLT в HTML-документе:

<?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>

Если вы хотите углубиться в изучение XSLT, пожалуйста, читайте наши XSLT Учебник.