Для того чтобы разобраться в приоритетах атрибутов
name
и
namespace
на определение пространства имен, приведем несколько правил, которые пояснят этот процесс.
□ Если в элементе
xsl:element
определен атрибут
namespace
, то создаваемый элемент будет принадлежать пространству имен с URI, который будет значением этого атрибута. Если значением атрибута
namespace
будет пустая строка, создаваемый элемент будет принадлежать нулевому пространству имен. Как правило, процессоры используют префикс, указанный в имени атрибутом
name
, но, вместе с тем, они не обязаны так делать. Поэтому в общем случае следует ожидать, что префикс может быть любым.
□ Если в элементе
xsl:element
не определен атрибут
namespace
, но имя, заданное в атрибуте name имеет префикс, то создаваемый элемент будет принадлежать соответствующему этому префиксу пространству имен. Однако и в этом случае не гарантируется, что префикс создаваемого элемента будет таким, каким он был задан в атрибуте
name
.
□ В случае, если в элементе
xsl:element
не определен атрибут
namespace
и имя, заданное в атрибуте name не имеет префикса, создаваемый элемент будет принадлежать пространству имен, которое действует для создающего элемента
xsl:element
по умолчанию.
Повторим еще раз, что во всех трех случаях сказать что-либо достоверно о префиксе создаваемого элемента нельзя — префикс с точки зрения пространств имен не является значащей частью имени элемента. Вместе с тем, на практике процессоры, как правило, используют префикс, указанный в атрибуте
name
,
или не используют префикс вообще, если префикс в
name
указан не был.
Приведем несколько примеров.
Для начала покажем, что, согласно первому правилу, атрибут
namespace
имеет наивысший приоритет при определении пространства имен выходящего элемента. Рассмотрим следующее преобразование.
Листинг 7.4.
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:element
name="xsl:html"
namespace="http://www.w3.org/1999/xhtml"/>
</xsl:template>
</xsl:stylesheet>
В выделенном элементе
xsl:element
пространство имен создаваемого элемента указано вроде бы два раза: в виде значения атрибута