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