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-aliasMDN (рус.)xsl:namespace-aliasMSDN (en)