Преобразование, генерирующее такой код, не представляет особой сложности. Например, шаблон для обработки элемента replace может иметь следующий вид:
<xsl:template match="replace">
<xsl:element name="xsl:template">
<xsl:attribute name="match">
<xsl:value-of select="@select"/>
</xsl:attribute>
<xsl:element name="xsl:element">
<xsl:attribute name="name">
<xsl:value-of select="@with"/>
</xsl:attribute>
<xsl:element name="xsl:apply-templates"/>
</xsl:element>
</xsl:element>
</xsl:template>
Шаблон
этот выглядит очень громоздко, потому что мы не могли просто включить в него создаваемое правило: поскольку мы создаем элементы в пространстве имен XSLT, находясь в шаблоне, они воспринимались бы не как генерируемые, а как принадлежащие генерирующему преобразованию. Очевидно, что шаблон вида
<xsl:template match="replace">
<xsl:template match="{@select}">
<xsl:element name="{@with}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:template>
был бы некорректен. По этой причине нам пришлось генерировать все инструкции при помощи
xsl:element
и
xsl:attribute
, что сделало шаблон громоздким и малопонятным.
Если внимательно рассмотреть проблему, то окажется, что она состоит в том, что мы хотим в преобразовании использовать элементы одного пространства имен так, как если бы они относились к другому пространству.
К счастью, XSLT предоставляет легкий и удобный способ для решения такого рода задачи: пространству имен можно назначить псевдоним при помощи элемента
xsl:namespace-alias
.
Элемент xsl:namespace-alias
Синтаксическая конструкция этого элемента выглядит следующим образом:
<xsl:namespace-alias
stylesheet-prefiх="префикс" | "#default"
result-prefix="префикс" | "#default"/>
Элемент
xsl:namespace-alias
назначает пространству имен выходящего документа пространство имен, которое будет подменять его в преобразовании, иначе говоря — псевдоним.
указывает, какое пространство имен будет использоваться в качестве его псевдонима в преобразовании. Оба атрибута содержат префиксы пространств имен, которые, естественно, должны быть ранее объявлены в преобразовании.
Пример
Возвращаясь к генерации преобразования, мы можем изменить пространство имен генерируемых элементов так, чтобы они не воспринимались процессором как элементы XSLT. Для того чтобы в выходящем
документе эти элементы все же принадлежали пространству имен XSLT, измененное пространство имен в преобразовании должно указываться как псевдоним этого пространства.