x:
- это идентификатор пространства имен в вашем XML. В поддереве XML может быть одно пространство имен по умолчанию для элементов и атрибутов (устанавливается xmlns='...'
). Если вам нужны элементы или атрибуты из других пространств имен, вам необходимо определить префикс, например xmlns:x='...'
. Элементы и атрибуты, которые вы используете из этого пространства имен, должны иметь префикс x:
. Обычный у меня есть
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
, что требует от меня, чтобы элемент use
сделал следующее:
<use xlink:href='#foo'/>
В этом случае элемент use
происходит из SVG, а атрибут href
- из XLink. Оба отличаются, но в некоторых местах совместимы спецификации.
И это в основном то, для чего нужны пространства имен:
- Группирует различные виды использования XML в связные части
- Разрешить их использование в одном XML
- Потенциально избегайте столкновений имен (если у вас есть два пространства имен, и оба допускают элемент с именем
foo
, то вам нужно указать , какой из двух foo
s вы хотите.
Таким образом, пространства имен мало чем отличаются от того, как они работают во многих языках программирования. Вы можете просматривать вещи, которые вы импортируете, с помощью пространств имен, как библиотеки в приведенном выше случае SVG. Люди, пишущие SVG, заметили, что уже существует спецификация, позволяющая ссылаться на произвольные элементы XML (XLink), и они просто использовали ее повторно. В других случаях, таких как WPF, существуют пространства имен для разделения декларативного пользовательского интерфейса инфраструктуры представления и связующих атрибутов, необходимых для взаимодействия с кодом. Например. окно может выглядеть так:
<Window
x:Class="W"
Height='500'
Width='500'
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
Атрибут Class
необходим только для того, чтобы компилятор знал соответствующий класс codebehind, он не имеет видимых различий в окне.
Другим примером является XSLT, где вы определяете преобразования в документах XML. Инструкции XSLT и шаблоны для вывода являются XML. Обычно вы используете явное пространство имен для элементов XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
, чтобы вы могли генерировать сгенерированный XML следующим образом:
<xsl:if test="Content/Chapter">
<xsl:variable name="text"><xsl:value-of select="$trans//item[@name='content'][lang($lang)]" /></xsl:variable>
<h2><xsl:value-of select="$text"/></h2>
<ol>
<xsl:apply-templates select="Content" mode="TableOfContents"/>
</ol>
</xsl:if>
Если бы я сделал пространство имен xsl:
пространством имен по умолчанию, тогда процессор XSLT не смог бы отличить мой HTML-код от реальных инструкций. Это проблема, если ваш код и данные используют один и тот же формат и живут в одном и том же месте. Я полагаю, что Лисп решил это, пометив данные одинарной кавычкой.
Что касается пространств имен, являющихся URI, то, вероятно, это просто W3C. Там нет требования, чтобы что-либо жить в этих URI. Они просто идентификаторы. Они не предназначены для извлечения. Программа, использующая XML с пространствами имен, должна знать пространства имен, которые она может обрабатывать, и действовать соответствующим образом.