</xsclass="underline" template>
<xsclass="underline" template match="@*|node()">
<xsclass="underline" copy>
<xsclass="underline" apply-templates select="@*|node()"/>
</xsclass="underline" copy>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Преобразование, генерирующее такой код, не представляет особой сложности. Например, шаблон для обработки элемента replace может иметь следующий вид:
<xsclass="underline" template match="replace">
<xsclass="underline" element name="xsclass="underline" template">
<xsclass="underline" attribute name="match">
<xsclass="underline" value-of select="@select"/>
</xsclass="underline" attribute>
<xsclass="underline" element name="xsclass="underline" element">
<xsclass="underline" attribute name="name">
<xsclass="underline" value-of select="@with"/>
</xsclass="underline" attribute>
<xsclass="underline" element name="xsclass="underline" apply-templates"/>
</xsclass="underline" element>
</xsclass="underline" element>
</xsclass="underline" template>
Шаблон этот выглядит очень громоздко, потому что мы не могли просто включить в него создаваемое правило: поскольку мы создаем элементы в пространстве имен XSLT, находясь в шаблоне, они воспринимались бы не как генерируемые, а как принадлежащие генерирующему преобразованию. Очевидно, что шаблон вида
<xsclass="underline" template match="replace">
<xsclass="underline" template match="{@select}">
<xsclass="underline" element name="{@with}">
<xsclass="underline" apply-templates/>
</xsclass="underline" element>
</xsclass="underline" template>
</xsclass="underline" template>
был бы некорректен. По этой причине нам пришлось генерировать все инструкции при помощи xsclass="underline" element и xsclass="underline" attribute, что сделало шаблон громоздким и малопонятным.
Если внимательно рассмотреть проблему, то окажется, что она состоит в том, что мы хотим в преобразовании использовать элементы одного пространства имен так, как если бы они относились к другому пространству.
К счастью, XSLT предоставляет легкий и удобный способ для решения такого рода задачи: пространству имен можно назначить псевдоним при помощи элемента xsclass="underline" namespace-alias.
Элемент xsclass="underline" namespace-alias
Синтаксическая конструкция этого элемента выглядит следующим образом:
<xsclass="underline" namespace-alias
stylesheet-prefiх="префикс" | "#default"
result-prefix="префикс" | "#default"/>
Элемент xsclass="underline" namespace-alias назначает пространству имен выходящего документа пространство имен, которое будет подменять его в преобразовании, иначе говоря — псевдоним.
Обязательный атрибут result-prefix указывает, какому пространству имен назначается псевдоним. Обязательный атрибут stylesheet-prefix указывает, какое пространство имен будет использоваться в качестве его псевдонима в преобразовании. Оба атрибута содержат префиксы пространств имен, которые, естественно, должны быть ранее объявлены в преобразовании.
Возвращаясь к генерации преобразования, мы можем изменить пространство имен генерируемых элементов так, чтобы они не воспринимались процессором как элементы XSLT. Для того чтобы в выходящем документе эти элементы все же принадлежали пространству имен XSLT, измененное пространство имен в преобразовании должно указываться как псевдоним этого пространства.
<xsclass="underline" stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:axsl="http://www.w3.org/1999/XSL/Transform/Alias">
<xsclass="underline" namespace-alias
stylesheet-prefix="axsl"
result-prefix="xsl"/>
<xsclass="underline" template match="replace">
<axsclass="underline" template match="{@select}">
<axsclass="underline" element name="{@with}">
<axsclass="underline" apply-templates/>
</axsclass="underline" element>
</axsclass="underline" template>
</xsclass="underline" template>
<xsclass="underline" template match="remove">
<axsclass="underline" template match="{@select}"/>
</xsclass="underline" template>
<xsclass="underline" template match="transform">
<axsclass="underline" stylesheet version="1.0">
<xsclass="underline" apply-templates/>
<axsclass="underline" template match="@*|node()">
<axsclass="underline" copy>
<axsclass="underline" apply-templates select="@*|node()"/>
</axsclass="underline" copy>
</axsclass="underline" template>
</axsclass="underline" stylesheet>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
В этом преобразовании элемент xsclass="underline" namespace-alias указывает на то, что все элементы, принадлежащие в преобразовании пространству имен с URI
http://www.w3.org/1999/XSL/Transform/Alias
в выходящем документе должны принадлежать пространству имен с URI
http://www.w3.org/1999/XSL/Transform
то есть пространству имен XSLT.
Результатом применения этого преобразования к документу из листинга 8.13 будет следующий документ.
<axsclass="underline" stylesheet
version="1.0"
xmlns:axsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<axsclass="underline" template match="a"/>
<axsclass="underline" template match="b">
<axsclass="underline" element name="B">
<axsclass="underline" apply-templates/>
</axsclass="underline" element>
</axsclass="underline" template>
<axsclass="underline" template match="c">
<axsclass="underline" element name="C">
<axsclass="underline" apply-templates/>
</axsclass="underline" element>
</axsclass="underline" template>
<axsclass="underline" template match="@*|node()">
<axsclass="underline" copy>
<axsclass="underline" apply-templates select="@*|node()"/>
</axsclass="underline" copy>
</axsclass="underline" template>
</axsclass="underline" stylesheet>
В этом сгенерированном преобразовании элементы имеют префикс axsl, но при этом принадлежат пространству имен XSLT.
Атрибуты stylesheet-prefix и result-prefix элемента xsclass="underline" namespace-alias могут иметь значения "#default". Определение вида
<xsclass="underline" namespace-alias
stylesheet-prefix="a"
result-prefix="#default"/>
означает, что элементы, принадлежащие в преобразовании пространству имен а, в выходящем документе должны принадлежать пространству имен по умолчанию. Определение вида