<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
). Требуется сгруппировать объекты по своим источникам и получить документ приблизительно следующего вида.