xsl:namespace-alias¶
Элемент xsl:namespace-alias
назначает пространству имен выходящего документа пространство имен, которое будет подменять его в преобразовании, иначе говоря — псевдоним.
Не поддерживается браузером Mozilla Firefox.
Синтаксис¶
1 2 3 4 |
|
Атрибуты:
result-prefix
- обязательный атрибут, указывает, какому пространству имен назначается псевдоним.
stylesheet-prefix
- обязательный атрибут, указывает, какое пространство имен будет использоваться в качестве его псевдонима в преобразовании.
Оба атрибута содержат префиксы пространств имен, которые, естественно, должны быть ранее объявлены в преобразовании.
В XSLT 2.0 атрибуты result-prefix
и stylesheet-prefix
могут принимать значение #default
. Естественно, это приведет к ошибке при отсутствии пространства имен по умолчанию. Пространство имен по умолчанию определяется записью xmlns=
.
Описание и примеры¶
Любопытным фактом является то, что XML-документ, являющийся результатом выполнения XSLT-преобразования, может и сам быть XSLT- преобразованием. Иными словами, преобразования могут генерироваться другими преобразованиями. В некоторых случаях такая возможность будет очень полезна, например, входящий XML-документ может описывать преобразование, которое нужно сгенерировать.
Листинг 8.13. XML-документ, описывающий требуемое преобразование
1 2 3 4 5 |
|
Приведенный выше документ описывает преобразование, которое должно удалять из входящего документа элементы a
, а элементы b
и c
заменять элементами B
и C
соответственно. Такое преобразование может выглядеть следующим образом.
Листинг 8.14. Преобразование
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Преобразование, генерирующее такой код, не представляет особой сложности. Например, шаблон для обработки элемента replace
может иметь следующий вид:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Шаблон этот выглядит очень громоздко, потому что мы не могли просто включить в него создаваемое правило: поскольку мы создаем элементы в пространстве имен XSLT
, находясь в шаблоне, они воспринимались бы не как генерируемые, а как принадлежащие генерирующему преобразованию. Очевидно, что шаблон вида
1 2 3 4 5 6 7 |
|
был бы некорректен. По этой причине нам пришлось генерировать все инструкции при помощи xsl:element
и xsl:attribute
, что сделало шаблон громоздким и малопонятным.
Если внимательно рассмотреть проблему, то окажется, что она состоит в том, что мы хотим в преобразовании использовать элементы одного пространства имен так, как если бы они относились к другому пространству.
К счастью, XSLT предоставляет легкий и удобный способ для решения такого рода задачи: пространству имен можно назначить псевдоним при помощи элемента xsl:namespace-alias
.
Пример 1¶
Возвращаясь к генерации преобразования, мы можем изменить пространство имен генерируемых элементов так, чтобы они не воспринимались процессором как элементы XSLT. Для того чтобы в выходящем документе эти элементы все же принадлежали пространству имен XSLT, измененное пространство имен в преобразовании должно указываться как псевдоним этого пространства.
Листинг 8.15. Преобразование, использующее псевдонимы пространств имен
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
В этом преобразовании элемент xsl:namespace-alias
указывает на то, что все элементы, принадлежащие в преобразовании пространству имен с URI
1 |
|
в выходящем документе должны принадлежать пространству имен с URI
1 |
|
то есть пространству имен XSLT
.
Результатом применения этого преобразования к документу из листинга 8.13 будет следующий документ.
Листинг 8.16. Выходящее преобразование
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
В этом сгенерированном преобразовании элементы имеют префикс axsl
, но при этом принадлежат пространству имен XSLT.
Атрибуты stylesheet-prefix
и result-prefix
элемента xsl:namespace-alias
могут иметь значения "#default
". Определение вида
1 2 3 4 |
|
означает, что элементы, принадлежащие в преобразовании пространству имен a
, в выходящем документе должны принадлежать пространству имен по умолчанию. Определение вида
1 2 3 4 |
|
означает, что элементы, принадлежащие в преобразовании пространству имен по умолчанию, в выходящем документе должны принадлежать пространству имен a
.
Пример 2¶
Листинг 8.17. Преобразование
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Листинг 8.18. Выходящий документ
1 2 3 |
|
Результатом этого преобразования является то, что пространство имен с URI "urn:a
" стало пространством имен по умолчанию, а пространство имен с URI "urn:b
" изменило префикс на a
.
В преобразованиях можно объявлять несколько псевдонимов пространств имен при условии, что одно и то же пространство имен преобразования не должно быть объявлено элементами xsl:namespace-alias
с одинаковым порядком импорта псевдонимом для различных пространств имен выходящего документа.
Пример 3¶
Если преобразование a.xsl
содержит определение
1 2 3 4 |
|
а преобразование b.xsl
— определение
1 2 3 4 |
|
где в обоих преобразованиях префикс x
представляет одно пространство имен, а пространства имен a
и b
— разные, то преобразование a.xsl
не сможет включать преобразование b.xsl
и наоборот, потому что они будут иметь одинаковый порядок импорта и содержать элементы xsl:namespace-alias
, назначающие разным пространствам имен одинаковые псевдонимы. В одном преобразовании такие псевдонимы также не имеют права встречаться. Если же подобное все же случилось, процессор может сигнализировать ошибку или использовать определение, которое было дано в преобразовании последним.
Совсем иначе обстоит дело с импортированием. При импортировании определения старших в порядке импорта преобразований могут переопределять определения младших преобразований. Таким образом, если преобразование a.xsl
будет импортировать преобразование b.xsl
, пространство имен x
будет назначено псевдонимом пространству имен a
и наоборот.
Пример для XSLT 2.0¶
Чтобы продемонстрировать использование пространства имен по умолчанию с элементом <xsl:namespace-alias>
, мы рассмотрим две таблицы стилей; в одной используется атрибут result-prefix="#default"
, а в другой – атрибут stylesheet-prefix="#default"
. Первая таблица стилей:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Таблица стилей выдает следующий результат:
1 2 3 4 5 6 7 8 9 10 |
|
Исходная и сгенерированная таблицы стилей работают, так как все элементы XSLT находятся в пространстве имен по умолчанию http://www.w3.org/1999/XSL/Transform
.
Вторая таблица стилей:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Выходные данные этой таблицы стилей выглядят более типично:
1 2 3 4 5 6 7 8 9 10 |
|
См. также¶
Ссылки¶
xsl:namespace-alias
MDN (рус.)xsl:namespace-alias
MSDN (en)