XSLT — Преобразование
Корневым элементом, декларирующим документ таблицы стилей XSL, является <xsl:stylesheet> или <xsl:transform>.
Примечание: Элементы <xsl:stylesheet> и <xsl:transform> являются полными синонимами, и для декларации таблицы стилей можно использовать любой из них!
Согласно рекомендации консорциума W3C таблица стилей XSL декларируется следующим образом:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
или:
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Чтобы получить доступ к элементам, атрибутам и другим функциям XSLT, необходимо в начале документа декларировать пространство имен XSLT.
Строка xmlns:xsl=»http://www.w3.org/1999/XSL/Transform» указывает на официальное пространство имен XSLT консорциума W3C. Если вы используете это пространство имен, то вы также должны указывать и атрибут version=»1.
Начнем с чистого XML документа
Предположим, что нам нужно преобразовать следующий XML документ («cd_catalog.xml») в XHTML:
<?xml version="1.0" encoding="UTF-8"?> <catalog> <cd> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> <country>USA</country> <company>Columbia</company> <price>10.90</price> <year>1985</year> </cd> . . </catalog>
Просмотр XML файлов в IE, Chrome, Firefox, Safari и Opera: Откройте XML файл (нажмите на ссылку ниже) — XML документ будет отображаться в виде окрашенных в разные цвета корневого и дочерних элементов и их содержимого (кроме браузера Safari). Часто слева от элементов XML дерева выводится знак плюса (+) или минуса (-), при нажатии на который можно развернуть/свернуть структуру элемента. Чтобы просмотреть исходный код документа, нажмите правой кнопкой мыши на XML файл и в контекстном меню выберите пункт «Исходный код» (Opera) или «Просмотреть код страницы» (Chrome)!
Посмотреть «cd_catalog. xml»
Создание таблицы стилей XSL
Теперь создаем таблицу стилей XSL («cd_catalog.xsl») с шаблоном преобразования:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h3>My CD Collection</h3> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Просмотреть «cd_catalog.xsl»
Подключаем таблицу стилей XSL к XML документу
Добавляем ссылку на таблицу стилей XSL в XML документ («cd_catalog.
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="//msiter.ru/cd_catalog.xsl"?> <catalog> <cd> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> <country>USA</country> <company>Columbia</company> <price>10.90</price> <year>1985</year> </cd> . . </catalog>
Если вы используете XSLT совместимый браузер, то вы увидите корректно преобразованный из XML в XHTML документ.
Просмотреть результат
xsl:namespace-alias ⚡️ XSLT с примерами кода
Элемент xsl:namespace-alias
назначает пространству имен выходящего документа пространство имен, которое будет подменять его в преобразовании, иначе говоря — псевдоним.
Не поддерживается браузером Mozilla Firefox.
Синтаксис
<xsl:namespace-alias stylesheet-prefix="префикс | #default" result-prefix="префикс | #default" />
Атрибуты:
result-prefix
- обязательный атрибут, указывает, какому пространству имен назначается псевдоним.
stylesheet-prefix
- обязательный атрибут, указывает, какое пространство имен будет использоваться в качестве его псевдонима в преобразовании.
Оба атрибута содержат префиксы пространств имен, которые, естественно, должны быть ранее объявлены в преобразовании.
В XSLT 2.0 атрибуты result-prefix
и stylesheet-prefix
могут принимать значение #default
. Естественно, это приведет к ошибке при отсутствии пространства имен по умолчанию. Пространство имен по умолчанию определяется записью xmlns=
.
Описание и примеры
Любопытным фактом является то, что XML-документ, являющийся результатом выполнения XSLT-преобразования, может и сам быть XSLT- преобразованием. Иными словами, преобразования могут генерироваться другими преобразованиями. В некоторых случаях такая возможность будет очень полезна, например, входящий XML-документ может описывать преобразование, которое нужно сгенерировать.
Листинг 8.13. XML-документ, описывающий требуемое преобразование
<transform> <remove select="a" /> <replace select="b" with="B" /> <replace select="c" with="C" /> </transform>
Приведенный выше документ описывает преобразование, которое должно удалять из входящего документа элементы
, а элементы b
и c
заменять элементами B
и C
соответственно. Такое преобразование может выглядеть следующим образом.
Листинг 8.14. Преобразование
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:template match="a" /> <xsl:template match="b"> <xsl:element name="B"> <xsl:apply-templates /> </xsl:element> </xsl:template> <xsl:template match="c"> <xsl:element name="C"> <xsl:apply-templates /> </xsl:element> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> </xsl:stylesheet>
Преобразование, генерирующее такой код, не представляет особой сложности. Например, шаблон для обработки элемента replace
может иметь следующий вид:
<xsl:template match="replace"> <xsl:element name="xsl:template"> <xsl:attribute name="match"> <xsl:value-of select="@select" /> </xsl:attribute> <xsl:element name="xsl:element"> <xsl:attribute name="name"> <xsl:value-of select="@with" /> </xsl:attribute> <xsl:element name="xsl:apply-templates" /> </xsl:element> </xsl:element> </xsl:template>
Шаблон этот выглядит очень громоздко, потому что мы не могли просто включить в него создаваемое правило: поскольку мы создаем элементы в пространстве имен XSLT
, находясь в шаблоне, они воспринимались бы не как генерируемые, а как принадлежащие генерирующему преобразованию. Очевидно, что шаблон вида
<xsl:template match="replace"> <xsl:template match="{@select}"> <xsl:element name="{@with}"> <xsl:apply-templates /> </xsl:element> </xsl:template> </xsl:template>
был бы некорректен. По этой причине нам пришлось генерировать все инструкции при помощи xsl:element
и xsl:attribute
, что сделало шаблон громоздким и малопонятным.
Если внимательно рассмотреть проблему, то окажется, что она состоит в том, что мы хотим в преобразовании использовать элементы одного пространства имен так, как если бы они относились к другому пространству.
К счастью, XSLT предоставляет легкий и удобный способ для решения такого рода задачи: пространству имен можно назначить псевдоним при помощи элемента xsl:namespace-alias
Пример 1
Возвращаясь к генерации преобразования, мы можем изменить пространство имен генерируемых элементов так, чтобы они не воспринимались процессором как элементы XSLT. Для того чтобы в выходящем документе эти элементы все же принадлежали пространству имен XSLT, измененное пространство имен в преобразовании должно указываться как псевдоним этого пространства.
Листинг 8.15. Преобразование, использующее псевдонимы пространств имен
<xsl:stylesheet version="1. 0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:axsl="http://www.w3.org/1999/XSL/Transform/Alias" > <xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl" /> <xsl:template match="replace"> <axsl:template match="{@select}"> <axsl:element name="{@with}"> <axsl:apply-templates /> </axsl:element> </axsl:template> </xsl:template> <xsl:template match="remove"> <axsl:template match="{@select}" /> </xsl:template> <xsl:template match="transform"> <axsl:stylesheet version="1.0"> <xsl:apply-templates /> <axsl:template match="@*|node()"> <axsl:copy> <axsl:apply-templates select="@*|node()" /> </axsl:copy> </axsl:template> </axsl:stylesheet> </xsl:template> </xsl:stylesheet>
В этом преобразовании элемент xsl:namespace-alias
указывает на то, что все элементы, принадлежащие в преобразовании пространству имен с URI
http://www. w3.org/1999/XSL/Transform/Alias
в выходящем документе должны принадлежать пространству имен с URI
http://www.w3.org/1999/XSL/Transform
то есть пространству имен XSLT
.
Результатом применения этого преобразования к документу из листинга 8.13 будет следующий документ.
Листинг 8.16. Выходящее преобразование
<axsl:stylesheet version="1.0" xmlns:axsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <axsl:template match="a" /> <axsl:template match="b"> <axsl:element name="B"> <axsl:apply-templates /> </axsl:element> </axsl:template> <axsl:template match="c"> <axsl:element name="C"> <axsl:apply-templates /> </axsl:element> </axsl:template> <axsl:template match="@*|node()"> <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" />
означает, что элементы, принадлежащие в преобразовании пространству имен a
, в выходящем документе должны принадлежать пространству имен по умолчанию. Определение вида
<xsl:namespace-alias stylesheet-prefix="#default" result-prefix="a" />
означает, что элементы, принадлежащие в преобразовании пространству имен по умолчанию, в выходящем документе должны принадлежать пространству имен a
.
Пример 2
Листинг 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:a
» стало пространством имен по умолчанию, а пространство имен с URI «urn:b
» изменило префикс на a
.
В преобразованиях можно объявлять несколько псевдонимов пространств имен при условии, что одно и то же пространство имен преобразования не должно быть объявлено элементами xsl:namespace-alias
с одинаковым порядком импорта псевдонимом для различных пространств имен выходящего документа.
Пример 3
Если преобразование 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
будет назначено псевдонимом пространству имен a
и наоборот.
Пример для XSLT 2.0
Чтобы продемонстрировать использование пространства имен по умолчанию с элементом <xsl:namespace-alias>
, мы рассмотрим две таблицы стилей; в одной используется атрибут result-prefix="#default"
, а в другой – атрибут stylesheet-prefix="#default"
. Первая таблица стилей:
<?xml version="1.0" ?> <!-- namespace-alias2.xsl --> <stylesheet version="2.0" xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:xslout="[что угодно, кроме пространства имен XSL]" > <output method="xml" indent="yes" /> <namespace-alias stylesheet-prefix="xslout" result-prefix="#default" /> <template match="/"> <xslout:stylesheet version="1.0"> <xslout:output method="xml" /> <xslout:template match="/"> <xslout:copy-of select="." /> </xslout:template> </xslout:stylesheet> </template> </stylesheet>
Таблица стилей выдает следующий результат:
<?xml version="1.0" encoding="UTF-8" ?> <stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0" > <output method="xml" /> <template match="/"> <copy-of select="." /> </template> </stylesheet>
Исходная и сгенерированная таблицы стилей работают, так как все элементы XSLT находятся в пространстве имен по умолчанию http://www. w3.org/1999/XSL/Transform
.
Вторая таблица стилей:
<?xml version="1.0" ?> <!-- namespace-alias3.xsl --> <xsl:stylesheet version="2.0" xmlns="[что угодно, кроме пространства имен XSL]" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:output method="xml" indent="yes" /> <xsl:namespace-alias stylesheet-prefix="#default" result-prefix="xsl" /> <xsl:template match="/"> <stylesheet version="1.0"> <output method="xml" /> <template match="/"> <copy-of select="." /> </template> </stylesheet> </xsl:template> </xsl:stylesheet>
Выходные данные этой таблицы стилей выглядят более типично:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:output method="xml" /> <xsl:template match="/"> <xsl:copy-of select=". " /> </xsl:template> </xsl:stylesheet>
См. также
namespace-uri()
Ссылки
xsl:namespace-alias
MDN (рус.)xsl:namespace-alias
MSDN (en)
XHTML™ 1.1 — XHTML на основе модулей
XHTML™ 1.1 — XHTML на основе модулей — второе издание[далее] [оглавление]
Рекомендация W3C 23 ноября 2010 г.
заменено 27 марта 2018 г.
- Эта версия:
- https://www.w3.org/TR/2018/SPSD-xhtml11-20180327/
- Последняя версия:
- http://www.w3.org/TR/xhtml11/
- Предыдущая версия:
- http://www.w3.org/TR/2010/REC-xhtml11-20101123
- Предыдущая рекомендация:
- http://www.w3.org/TR/2001/REC-xhtml11-20010531
- Редакторы:
- Шейн Маккаррон, Applied Testing and Technology, Inc. [email protected]
- Масаясу Исикава, (до марта 2007 г. в W3C)
- Версия 1.1 Редакторы:
- Мюррей Альтейм, Sun Microsystems
Шейн Маккаррон, прикладное тестирование и технология
Пожалуйста, обратитесь к errata для этого документа, который может включать некоторые нормативные исправления. См. также переводы.
Copyright © 2001-2010 W3C ® (MIT, ERCIM, Keio), все права защищены. Применяются правила ответственности W3C, использования товарных знаков и документов.
Аннотация
Эта спецификация определяет тип документа XHTML, основанный на модульной структуре и модулях, определенных в модуляризации XHTML [XHTMLMOD]. Назначение этого типа документа состоит в том, чтобы служить основой для будущих расширенных «семейных» типов документов XHTML и обеспечивать согласованный, перспективный тип документа четко отделен от устаревшей функциональности HTML 4 [HTML4], которая была перенесена в типы документов XHTML 1. 0 [XHTML1]. Этот тип документа больше всего похож на XHTML 1.0 Strict, созданный с использованием XHTML-модулей. Это означает, что многие объекты, доступные в других Типы документов XHTML Family (например, XHTML Frames) недоступны в этом типе документа. Эти другие средства доступны через модули, определенные в XHTML Modularization, и авторы документов могут свободно определять типы документов на основе XHTML 1.1, которые используют эти средства (см. [XHTMLMOD] для получения информации о создании нового документа). виды).
В этом разделе описывается состояние этого документа на момент его публикации. Этот документ может быть заменен другими документами. Список текущих публикаций W3C и последняя редакция этот технический отчет можно найти в указателе технических отчетов W3C по адресу http://www.w3.org/TR/.
Данная спецификация является замененной рекомендацией. более новый существует спецификация, которая рекомендуется для нового принятия вместо эта спецификация.
Этот документ был рассмотрен членами W3C, разработчиками программного обеспечения, а также другими группами W3C и заинтересованными сторонами и утвержден директором в качестве рекомендации W3C.
Этот документ также заменяет предыдущую версию XHTML 1.1.
Этот документ был создан рабочей группой W3C XHTML 2 в рамках деятельности HTML.
Для целей Патентной политики W3C настоящая Замененная рекомендация имеет тот же статус, что и действующая рекомендация; он сохраняет лицензирование обязательства и остается доступным в качестве ссылки для старых — и возможно, все еще развернуты — реализации, но не рекомендуется для будущая реализация. Новые реализации должны следовать за последней версией спецификации HTML.
Версия данной спецификации на английском языке является единственной нормативной версией. Информация о переводах этого документа доступна по адресу http://www.w3.org/MarkUp/translations.
Список текущих рекомендаций W3C и других технических документов можно найти по адресу https://www. w3.org/TR/.
- 1. Введение
- 2. Определение соответствия
- 3. Тип документа XHTML 1.1
- A. Отличия от XHTML 1.0 Strict
- Б. Ссылки
- C. Определение типа документа XHTML 1.1
- D. Определение XML-схемы XHTML 1.1
- E. Благодарности
- 1. Введение
- 2. Определение соответствия
- 2.1. Соответствие документа
- 2.1.1. Строго соответствующие документы
- 2.2. Соответствие пользовательского агента
- 2.1. Соответствие документа
- 3. Тип документа XHTML 1.1
- A. Отличия от XHTML 1.0 Strict
- Б. Ссылки
- Б.1. Нормативные ссылки
- Б.2. Информативные ссылки
- C. XHTML 1.1 Определение типа документа
- С.1. Запись открытого каталога SGML для XHTML 1.1
- С.2. Драйвер XHTML 1.1
- С.3. Настройки XHTML 1.1
- D. Определение XML-схемы XHTML 1.1
- Д. 1. Драйвер схемы XHTML 1.1
- Д.2. Модули схемы XHTML 1.1
- Д.3. Настройки XHTML 1.1
- Д.4. Реализация XML-схемы Ruby
- E. Благодарности
[следующий] [оглавление]
xml — какое пространство имен по умолчанию используется для HTML/HTML5?
Как задокументировано W3C, который является органом, стоящим за спецификациями XML и HTML (WHATWG имеет отдельную спецификацию HTML 5, но, хотя она в некотором смысле не синхронизирована со спецификацией W3C, WHATWG по-прежнему считает ее ролью W3C чтобы стандартизировать спецификацию как REC), пространство имен для HTML при использовании с сериализацией XML (которую иногда называют XHTML) равно http://www.w3.org/1999/xhtml
.
Это пространство имен охватывает все версии HTML с такими XML-сериализациями, которые были определены до сих пор, включая XHTML 1.0 и 1.1, которые широко использовались более десяти лет, XHTML 2.0, в котором было представлено несколько модульных идей, но который, возможно, был более важным как инкубатор для нескольких идей, чем реализованная версия, и «HTML5, сериализованный как XML», который иногда называют XHTML5.
Поскольку другим органом, выступающим в гонке за то, как определяется HTML 5, является WHATWG, вы можете заметить, что они также говорят, что если вы сериализуете HTML5 как XML, вы должны использовать пространство имен http://www.w3.org/1999/xhtml
и с другой сериализацией либо не используют пространство имен, либо используют его. Согласно https://wiki.whatwg.org/wiki/FAQ#What_is_the_namespace_declaration.3F:
В XHTML требуется указать пространство имен.
В HTML атрибут xmlns в настоящее время разрешен для любого элемента HTML, но только если он имеет значение «http://www.w3.org/1999/xhtml». Он вообще ничего не делает, ему просто разрешено упростить миграцию с XHTML1. На самом деле это не объявление пространства имен в HTML, потому что HTML еще не поддерживает пространства имен. Смотрите вопрос, будет ли поддержка пространств имен в HTML.
Следующий FAQ также актуален здесь:
HTML определяется в терминах DOM, и во время синтаксического анализа text/html все элементы HTML будут автоматически помещаться в пространство имен HTML,
http://www. w3.org/1999/xhtml
. Однако, в отличие от сериализации XHTML, в сериализации HTML нет настоящего синтаксиса пространства имен (см. предыдущий вопрос). Другими словами, вам не нужно объявлять пространство имен в HTML-разметке, как в XHTML. Однако вам разрешено помещать атрибут xmlns в каждый элемент HTML, если пространство имен равно 9.0145 http://www.w3.org/1999/xhtml .Кроме того, синтаксис HTML позволяет встраивать элементы из MathML и SVG. Элементы, размещенные внутри контейнера element
math
илиsvg
, будут автоматически помещены синтаксическим анализатором в пространство имен MathML или пространство имен SVG соответственно. Синтаксис пространства имен не требуется, но опять же разрешен атрибут xmlns, если его значение соответствует правильному пространству имен.В заключение, хотя HTML не поддерживает синтаксис пространства имен XML, существует способ встраивания MathML и SVG, а атрибут xmlns можно использовать для любого элемента с заданными ограничениями таким образом, чтобы он был разумно совместим на уровне DOM.