<axsl:copy>
<axsl:apply-templates select='@*|node()'/>
</axsl:copy>
</axsl:template>
</axsl:stylesheet>
В этом сгенерированном преобразовании элементы имеют префикс axsl, но при этом принадлежат пространству имен XSLT.
Атрибуты stylesheet-prefix и result-prefix элемента xsl:namespace-alias могут иметь значения '#default'. Определение вида
<xsl:namespace-alias
stylesheet-prefix='a'
result-prefix='#default'/>
означает, что элементы, принадлежащие в преобразовании пространству имен а, в выходящем документе должны принадлежать пространству имен по умолчанию. Определение вида
<xsl:namespace-alias
stylesheet-prefix='#default'
result-prefix='a'/>
означает, что элементы, принадлежащие в преобразовании пространству имен по умолчанию, в выходящем документе должны принадлежать пространству имен а.
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:a='urn:a'
xmlns='urn:b'>
<xsl:namespace-alias
stylesheet-prefix='#default'
result-prefix='a'/>
<xsl:namespace-alias
stylesheet-prefix='a'
result-prefix='#default'/>
<xsl:template match='root'>
<result>
<a:element/>
</result>
</xsl:template>
</xsl:stylesheet>
<result xmlns='urn:a' xmlns:a='urn:b'>
<a:element/>
</result>
Результатом этого преобразования является то, что пространство имен с URI 'urn:а' стало пространством имен по умолчанию, а пространство имен с URI 'urn:b' изменило префикс на а.
В преобразованиях можно объявлять несколько псевдонимов пространств имен при условии, что одно и то же пространство имен преобразования не должно быть объявлено элементами xsl:namespace-alias с одинаковым порядком импорта псевдонимом для различных пространств имен выходящего документа.
Если преобразование a.xsl содержит определение
<xsl:namespace-alias
stylesheet-prefix='x'
result-prefix='a'/>
а преобразование b.xsl — определение
<xsl:namespace-alias
stylesheet-prefix='x'
result-prefix='b'/>
где в обоих преобразованиях префикс x представляет одно пространство имен, а пространства имен a и b — разные, то преобразование a.xsl не сможет включать преобразование b.xsl и наоборот, потому что они будут иметь одинаковый порядок импорта и содержать элементы xsl:namespace-alias, назначающие разным пространствам имен одинаковые псевдонимы. В одном преобразовании такие псевдонимы также не имеют права встречаться. Если же подобное все же случилось, процессор может сигнализировать ошибку или использовать определение, которое было дано в преобразовании последним.
Совсем иначе обстоит дело с импортированием. При импортировании определения старших в порядке импорта преобразований могут переопределять определения младших преобразований. Таким образом, если преобразование a.xsl будет импортировать преобразование b.xsl, пространство имен x будет назначено псевдонимом пространству имен а и наоборот.
Ключи
Прежде чем мы приступим к разбору ключей, которые являются одной из самых мощных концепций языка XSLT, попробуем решить одну несложную задачку.
<items>
<item source='a' name='A'/>
<item source='b' name='B'/>
<item source='a' name='C'/>
<item source='c' name='D'/>
<item source='b' name='E'/>
<item source='b' name='F'/>
<item source='c' name='G'/>
<item source='a' name='H'/>
</items>
Пусть входящий документ представляет собой список объектов (элементов item), каждый из которых имеет имя (атрибут name) и источник (атрибут source). Требуется сгруппировать объекты по своим источникам и получить документ приблизительно следующего вида.
