этом сгенерированном преобразовании элементы имеют префикс
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"/>
означает, что элементы, принадлежащие в преобразовании пространству имен по умолчанию, в выходящем документе должны принадлежать пространству имен
а
.
Пример
Листинг 8.17. Преобразование
<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>
Листинг 8.18. Выходящий документ
<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, попробуем решить одну несложную задачку.
Листинг 8.19. Входящий документ
<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
). Требуется сгруппировать объекты по своим источникам и получить документ приблизительно следующего вида.