<xsl:namespace> XSLT

Элемент xsl:namespace создает узел пространства имен в дереве результата.

Синтаксис

XSLT 2.0 и XSLT 3.0

<xsl:namespace
    name = "имя"
    select = "выражение">
    <!-- Содержимое: sequence-constructor -->
</xsl:namespace>

Атрибуты

  • nameобязательный атрибут, префикс пространства имен.
  • selectнеобязательный атрибут, выражение XPath, определяющее значение самого пространства имен. Если атрибут select не задан, элемент <xsl:namespace> должен иметь содержимое.

Содержимое

Элемент <xsl:namespace> должен иметь либо содержимое, либо атрибут select; их одновременное присутствие (или отсутствие) является ошибкой. Кроме того, ошибка происходит и в том случае, если результат обработки <xsl:namespace> представляет собой строку нулевой длины.

Описание и примеры

Пример

Следующий пример позаимствован из спецификации XSLT 2.0. Таблица стилей содержит литеральный элемент результата, в котором присутствует элемент <xsl:namespace>:

<?xml version="1.0"?>
<!-- namespace.xsl -->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <data xsi:type="xs:integer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <xsl:namespace name="xs" select="'http://www.w3.org/2001/XMLSchema'"/>
            <xsl:text>42</xsl:text>
        </data>
    </xsl:template>
</xsl:stylesheet>

Обратите внимание на апострофы, в которые заключено значение атрибута select (и вместе с которыми оно заключается во внешние кавычки); без апострофов выражение выберет все элементы <http://www.w3.org/2001/XMLSchema>, что приведет к ошибке.

Результат применения таблицы стилей выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:integer">42</data>

Можно также записать таблицу стилей без атрибута select, поместив значение пространства имен в элементе <xsl:namespace>:

<?xml version="1.0"?>
<!-- namespace2.xsl -->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <data xsi:type="xs:integer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <xsl:namespace name="xs">
                <xsl:text>http://www.w3.org/2001/XMLSchema</xsl:text>
            </xsl:namespace>
            <xsl:text>42</xsl:text>
        </data>
    </xsl:template>
</xsl:stylesheet>

Наконец, тот же результат можно сгенерировать при помощи таблицы стилей, в которой <xsl:namespace> вообще не используется:

<?xml version="1.0"?>
<!-- namespace3.xsl -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <data xsi:type="xs:integer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xsl:text>42</xsl:text>
        </data>
    </xsl:template>
</xsl:stylesheet>

Скорее всего, в ваших таблицах стилей элемент <xsl:namespace> будет использоваться только в одной ситуации: при создании нового элемента <xsl:element> с определением пространства имен, особенно если это пространство имен используется в содержимом. (Если пространство имен используется в именах элементов или атрибутах, оно будет скопировано в итоговый элемент автоматически.)