Из §11.1.2 спецификации XSLT 3.0 (в равной степени применимо к более ранним версиям):
Атрибуты xml: base, xml: lang, xml: space и xml: id имеют дваэффекты в XSLT.Они ведут себя как стандартные атрибуты XSLT, что означает, например, что если они появятся в буквальном элементе результата, они будут скопированы в дерево результатов так же, как и любой другой атрибут.Кроме того, они имеют стандартное значение, определенное в основных спецификациях XML.Таким образом, атрибут xml: base в таблице стилей влияет на базовый URI элемента, в котором он появляется, а атрибут xml: space влияет на интерпретацию текстовых узлов пробелов в этом элементе.Одним из следствий этого является то, что нежелательно записывать эти атрибуты как шаблоны значений атрибутов: хотя процессор XSLT будет понимать эту запись, синтаксический анализатор XML не будет.См. Также 11.1.4 Псевдоним пространства имен, в котором описано, как использовать псевдоним xsl: namespace с этими атрибутами.
То же самое верно для атрибутов, определенных в схеме: xsi: type, xsi: nil, xsi: noNamespaceSchemaLocation иXSI: SchemaLocation.Если таблица стилей обрабатывается процессором схемы, эти атрибуты будут распознаваться и интерпретироваться процессором схемы, но, кроме того, процессор XSLT обрабатывает их как любой другой атрибут в буквальном элементе результата: то есть их эффективное значение (после расширения атрибутаШаблоны значений) копируется в дерево результатов так же, как и любой другой атрибут.Если дерево результатов проверено, скопированные атрибуты снова будут распознаваться и интерпретироваться процессором схемы.
На практике это означает, что лучше избегать включения этих специальных атрибутов буквально в таблицу стилей.Если вы хотите сгенерировать их в дереве результатов, используйте xsl:attribute
для достижения этого.Вы также можете использовать xsl:namespace-alias
, чтобы использовать другой URI пространства имен, связанный с «специальным» URI.