Время на прочтение
10 мин
Количество просмотров 49K
В сети доступно масса документации по языку XSL. Данный раздел не претендует на роль документации по языку, а лишь кратко, по шагам объясняет, как создать свой XSLT-шаблон.
Описанная ниже схема успешно мною используется уже более 3 лет. По началу я к XSLT относился с большой опаской (особенно, когда разбирал чужие исходники), однако однажды поняв, что к чему, уже не представляю, как без него можно работать.
Рабочий стол
Определим, что нам нужно для работы:
- Входной XML-документ
- XHTML-макет шаблона
- Парсер XML для склейки XML с XSL
У меня входной XML документ выдает CMS-система, в которой каждая страница с материалом собирается в XML-дерево.
К XHTML-макету никаких ограничений нет. Есть лишь определенные рекомендации по верстке, которые позволят значительно сэкономить время на формирование шаблона.
В качестве парсера (сборщика) конечного документа можно использовать браузер. Нужно лишь указать в XML-документы путь к файлу шаблону:
<?xml-stylesheet type="text/xsl" href="template.xsl" ?>
Хотя, как показала практика, этот механизм довольно глючный (мне пришлось пользовать IE). Лучше воспользоваться средствами XML-парсинга языка, на котором написана CMS-система. Я использую Parser (на нем, вообщем-то, у меня вся система и работает).
Входной XML-документ
Для начала разберемся со входным XML-документом. Для того, чтобы использовать XSL нужно иметь полное представление о его структуре.
Я использую следующую схему:
<?xml version="1.0" encoding="windows-1251"?>
Начало
<lang_table>
/>
</lang_table>
<item id="0" parent_id="0" is_published="1" section="1">
Начало
/
<item id="1" parent_id="0" is_published="1" section="1">
Новости
news
Обозначенный выше пример схемы не претендует на свою оптимальность. В силу тех или иных причин, мне он удобен. Но, обо всем по порядку.
<?xml version="1.0" encoding="windows-1251"?>
— заголовок XML-файла. Должен идти строго с начала файла. В нем прописана версия используемого XML-языка и кодировка документа. Я как правило работаю в windows-1251 (пока так удобнее), но, по идее UTF-8 лучше.
- корневой элемент документа (можно придумать свое имя). Атрибуты:
- Lang - язык документа. Нужен для создания мультиязычных шаблонов.
- Id - идентификатор текущего раздела.
<lang_table> - таблица языков, используемых на сайте.
- блок элементов навигации:
- элемент структуры сайта. Атрибуты:
- блок основной навигации (основная структура сайта):
<item id="0" parent_id="0" is_published="1" section="1">
- Id - идентификатор раздела.
- Parent_id - идентификатор родительского раздела.
- Is_published - опубликован ли раздел.
- Dir - uri-адрес раздела. По нему формируются полные адреса.
- Section - тип раздела. Используется если необходимо разбить меню на основное и сервисное.
- блок содержимого.
В моей CMS используется модульная структура: все наполнение сайта представляет собой модули двух видов:
- Html - текстовый модуль. Статические модули, которые заполняет редактор сайта.
- Com - модуль-компонента. Динамические модули, которые формируют различные программные модули CMS: новости, статистика, поисковые блоки и т.д.
В XSL-шаблонах есть разметка блоков, в которые можно размещать модули. Для определения блоков я использую простую нумерацию.
CMS при сборке страницы просто выводит в все модули, которые задействованы на странице в виде:
Атрибуты:
Id - идентификатор модуля.
Container - блок-назначение (в каком блоке шаблона выводиться).
Sorting - порядок вывода в блоке.
Type - тип:- Com - модуль-компонентаю
Html - текстовый модуль.
Method - обработчик данных.
Title - название модуля.
DTD я практически не использую (лишь в самом общем виде):
<!DOCTYPE site_page [<!ENTITY nbsp " ">
<!ENTITY sect "§" >
<!ENTITY copy "©">
<!ENTITY laquo "«">
<!ENTITY reg "®">
<!ENTITY deg "°">
<!ENTITY plusmn "±">
<!ENTITY para "¶">
<!ENTITY raquo "»">
<!ENTITY times "×"><!ENTITY bull "•">
<!ENTITY hellip "…"><!ENTITY ndash "–">
<!ENTITY mdash "—">
<!ENTITY lsquo "‘">
<!ENTITY rsquo "’">
<!ENTITY sbquo "‚">
<!ENTITY ldquo "“">
<!ENTITY rdquo "”">
<!ENTITY bdquo "„">
<!ENTITY lsaquo "‹">
<!ENTITY rsaquo "›" >
<!ENTITY euro "€">
]>
Его можно вставить прямо в XML-документ. Сразу после<?xml version="1.0" encoding="windows-1251"?>
.Подготовка XHML-шаблона
XSL-шаблон создается на базе XHTML-шаблона (некой типовой страницы сайта). Код XHTML-страницы, при этом, должен быть валидным.
Рассмотрим по шагам процесс создания шаблона.
Проверив валидность XHML-страницы своего шаблона, для облегчения собственной работы, обозначьте в нем положение всех динамических блоков:
- Меню (и других элементов навигации).
- Информационных блоков страницы - то место в шаблоне, в котором будут выводиться модули сайта.
- Заголовка/названия страницы.
Сделать это лучше всего с помощью обычных HTML-комментариев:
...
Администрирование сайта
...
- Начало
- Новости
- Разделы
...
Всякие новости
...
Текст
...
Основы описания XSL-шаблонов
Все файлы XSL-шаблонов имеют следующий вид:
<xsl:stylesheet version = '1.0' encoding="UTF-8"?>
<xsl:template match="element">
данные шаблона
</xsl:template>
</xsl:stylesheet>Где:
<xsl:stylesheet version = '1.0' encoding="UTF-8"?>
- определяет тип XML-документа и кодировку. Я использую UTF-8 (не спрашивайте, почему).
<xsl:stylesheet> </xsl:stylesheet>
- начало и конец XSL-документа.
<xsl:template match="element"> </xsl:template>
- начало и конец шаблона для элемента element.Шаблоны можно условно разделить на три вида:
<xsl:template match="element"></xsl:template>
- шаблон, описывающий правила преобразования элемента element. Применяется автоматически ко всем элементам element.<xsl:template match="element" mode="mode1"></xsl:template>
- шаблон, описывающий правила преобразования элемента element в режиме mode1. Таким образом можно описать различные правила обработки элементов element.<xsl:template name="template-name"></xsl:template>
- шаблон с именем template-name. Не имеет привязки к какому-либо элементу XML-документа.
Если элементы одного вида могут встречаться в различных частях структуры XML-документа (например, в XML-документе, формируемом системой элемент item используется повсеместно и имеет разное значение), то в шаблоне можно указать "структурный адрес" такого элемента:
<xsl:template match="navigation/sections/item"></xsl:template>
При этом, порядок применения шаблонов иерархичный, т.е., сначала шаблон применяется к корневому элементу, а затем, к дочерним, т.е. если мы вызвали обработчик для navigation, то для вызова обработчика для navigation/sections/item нам достаточно указать адрес sections/item.Структура папок шаблонов
Для того, чтобы хранить на одном сайте несколько модулей необходимо как-то продумать структуру их хранения в папкам. При этом, удобнее разбить шаблоны на модули по нескольким xsl-файлам. Такой подход позволит в дальнейшем повторно их использовать при создании новых шаблонов.
В простейшем варианте можно создать каталог xsl и там все складировать.
Далее, чтобы внутри этого каталог шаблоны не путались (для каждого шаблона у нас получиться несколько файлов) создадим вложенные каталоги:
- template_folder - каталог с файлами шаблона. Называть ее можно по имени шаблона, например my_template.
- dtd - файлы описания основных сущностей. Могут быть полезными.
- lang - шаблоны сообщений для различных языков (если на сайте используется их используется несколько).
- mod - шаблоны модулей.
Нам для начала потребуется создать каталог xsl/my_template и в нем, файл layout.xsl следующего вида:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "../dtd/entities.dtd">
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/node()">
</xsl:template></xsl:stylesheet>
Где:
<xsl:template match="/node()"> </xsl:template>
- шаблон для элемента /node() (корневого). Вместо /node() можно указать //document, т.к. он у нас являеться корневым узлом.Копируем весь XHTML-код внутрь блока
<xsl:template match="/node()"></xsl:template>
Этот шаблон будет автоматически применяться ко всему XML-документу. В нашем случае, XSL-преобразование заменит весь XML-код на XHTML-код вашего шаблона.
Далее, необходимо в директории XSL создать файл template.xsl (где, template - название вашего шаблона), в котором размещаем следующий код:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:import href=" my_template /layout.xsl"/>
</xsl:stylesheet>
Где:
<xsl:import href="my_template/layout.xsl"/>
Директива импорта внешнего XSL-файла (обрабатываеться XSL-процессором) из указанного файла. Путь к файлу указываем относительный.Создание шаблона для основного навигационного меню
Наш предыдущий шаблон не обладает никакой динамикой, т.к. просто заменяет весь выходной XML-документ на код нашего шаблона.
Следующий шаг - создание шаблона для меню.
Меню навигации сайта строиться на основе его структуры, представленной в XML-документе в следующем виде:
<item id="0" parent_id="0" is_published="1" section="1">
Начало
/<item id="1" parent_id="0" is_published="1" section="1" hit="yes">
Новости
newsТекущий раздел определяется по двум параметрам:
- Атрибуту id у корневого элемента document - он всегда равен id текущего раздела.
- Атрибуту hit у элемента item - если таковой имеется, то это значит, мы находимся на "главной странице раздела".
Соответственно, для того, чтобы вывести меню сайта необходимо создать шаблон для элементов:
- sections - корневой элемент меню.
- item - элемент меню.
При этом, необходимо учесть, что элементы item могут содержать другие элементы item, в том случае, если у раздела есть подразделы:
1. Создаем в директории xsl/my_template файл navigation.xsl следующего вида:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "../dtd/entities.dtd">
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="sections" mode="global_menu">
</xsl:template></xsl:stylesheet>
2. Вставляем в шаблон код нашего меню из файла layout.xsl:
<xsl:template match="sections" mode="global_menu">- Начало
- Разделы
- Новости
</xsl:template>
3. …а на его место в файле layout.xsl вставляем вызов нашего шаблона меню:
<xsl:apply-templates select="navigation/sections" mode="global_menu"/>
Где:
select="navigation/sections" - относительный (относительно текущего) путь-адрес элемента. При этом, будут обработаны все элементы navigation/sections.mode="global_menu" - используем шаблон с режимом global_menu. Это нам нужно на тот случай, если нужно будет выводить еще и сервисное меню, отдельно, или "хлебные крошки", или что-еще другое на основе одной и той же ветки навигации.
4. Плюс, добавим в файл layout.xsl директиву импорта файла шаблона navigation.xsl:
<xsl:import href="navigation.xsl"/>
5. Далее, создаем в файле navigation.xsl еще один шаблон, для обработки пунктов меню:
<xsl:template match="item" mode="global_menu">
<xsl:call-template name="href_attribute"/>
<xsl:value-of select="title"/></xsl:template>
Где:
<xsl:call-template name="href_attribute"/>
- вызов шаблона по имени. При этом шаблон не имеет привязки к элементу, т.е. вызывается произвольно.<xsl:value-of select="title"/>
- вставка-вывод значения элемента title текущего элемента. Если в параметре перед именем элемента поставить символ @ - выводиться будет значения атрибута текущего элемента.6. Немного изменяем шаблон sections:
<xsl:template match="sections" mode="global_menu"></xsl:template>
Где:
<xsl:apply-templates select="item" mode="global_menu"/>
- обработка всех элементов item элемента sections. При этом, элементы item самих элементов item (sections/item/item) обрабатываться не будут, т.е. выводиться только один уровень меню разделов.Мы вынесли обработку элементов item (пунктов меню) в отдельный шаблон. При этом, в нем мы добавили еще и вызов другого шаблона:
<xsl:call-template name="href_attribute"/>
Этот шаблон будет формировать нормальные uri-ссылки для элементов нашего меню. О нем немного позже.
7. Теперь нам необходимо доделать меню,
чтобы оно учитывало, какой раздел является текущим. Для этого нам придется добавить условную обработку в наш шаблон элемента item:
<xsl:template match="item" mode="global_menu"><xsl:choose>
<xsl:when test="descendant-or-self::*/@id = /node()/@id">
<xsl:value-of select="title"/>
</xsl:when><xsl:otherwise>
<xsl:call-template name="href_attribute"/>
<xsl:value-of select="title"/></xsl:otherwise>
</xsl:choose></xsl:template>
Здесь мы сталкиваемся с новой конструкцией:
<xsl:choose>
<xsl:when></xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
…которая, собственно, и задает условную обработку XML-элементов. В качестве параметра мы задаем условие:<xsl:when test="descendant-or-self::*/@id = /node()/@id">
В нашем случае это условие равенства атрибутов ID у корневого элемента (document) и текущего элемента (item), которое и определяет, является ли элемент текущим.
Внутри блока
<xsl:when></xsl:when>
располагается то, что выводиться в случае выполнения условия. В блоке<xsl:otherwise></xsl:otherwise>
- если условие не выполняется.8. Теперь, разберем шаблон href_attribute:
<xsl:template name="href_attribute">
<xsl:attribute name="href">
<xsl:text>/</xsl:text>
<xsl:for-each select="ancestor-or-self::item">
<xsl:value-of select="dir"/>
<xsl:text>/</xsl:text>
</xsl:for-each>
</xsl:attribute>
</xsl:template>
Здесь мы сталкиваемся с инструкцией xsl:attribute. Она позволяет создавать атрибуты для элементов внутри которого она вызывается. В нашем случае мы вызываем ее из элемента a, соответственно, она создаст для него атрибут href, т.е. адрес.
Инструкция
<xsl:for-each select="ancestor-or-self::item">
задает цикл обработки для всех элементов, удовлетворяющих условию. В нашем случае мы выбираем ancestor-or-self::item - ось элементов от корневого элемента до текущего по цепочке. В нашем случае это позволяет выбрать для всей цепочки узлы dir, т.е. построить полный адрес текущего узла-раздела.Далее, нам необходимо каким-то образом определить, как у нас будут обрабатываться модули содержимого. Но, об этом в следующий раз.
UPD:
Материалы к статье. Собрал из того, что было:
parser.proc.ru/iso/xslt-1.zipВ шаблоне все пути прописаны от корня (делал на основе шаблона работающего на реальном сайте) поэтому либо перепишите их на относительные либо запускайте из под Apache.
В архиве входной XML-документ лежит в /xsl/document.xml
- Com - модуль-компонентаю
Содержание
- Встроенные шаблоны
- Инструкции или правила шаблона
- Фиксированные конечные элементы
- Шаблон значения атрибута
Основой преобразования элементов исходного дерева в конечное являются инструкции или правила, содержащиеся в так называемых шаблонах (Template). В XSL документе шаблоны задаются с помощью элемента xsl:template
.
Процесс xslt-преобразования выглядит следующим образом: XSLT-процессор анализирует исходный XML-документ, последовательно перебирая каждый его элемент. При этом для каждого элемента процессор пытается найти подходящий шаблон (template) в XSL-файле путем сопоставлении исходного элемента и содержащегося в шаблоне образца (pattern). Если подходящий шаблон не найден, используется шаблон по умолчанию и процессор переходит к следующему элементу в исходном XML-документе. Если подходящий шаблон (template) найден процессор выполняет содержащиеся в шаблоне инструкции (Template Rules – правила шаблона), на основании чего строится конечное дерево. При этом текущим узлом для шаблона будет являться обрабатываемый узел XML-документа. В шаблоне могут содержаться правила (инструкции), выбирающие новый текущий узел.
Синтаксис:
<xsl:template match = “образец” name = “строка” priority = “число” mode = “строка”> Инструкции или фиксированные конечные элементы </xsl:template> |
Атрибуты:
match
– обязательный атрибут, задает образец (pattern), который определяет узлы исходного дерева, к которым данный шаблон должен быть применен. Образец записывается на языке XPath.priority
– задает приоритет шаблона, который учитывается при разрешении конфликтов шаблонов. Значением этого атрибута должно быть реальное число (положительное или отрицательное). При конфликте шаблонов (т.е. если исходному элементу соответствуют несколько шаблонов) применяется шаблон с наивысшим приоритетом.mode
– задает режим. Режимы позволяют обрабатывать элемент несколько раз, получая каждый раз другой результат. Подробнее режимы будут сказано при рассмотрении инструкцииxsl:apply-templates
.name
– задает имя шаблона, которое может быть использовано в инструкцииxsl:call-template
. Если элементxsl:template
содержит атрибутname
, то атрибутmatch
не является обязательным.
Внутри элемента xsl:template
задаются инструкции (правила) шаблона и фиксированные конечные элементы.
Встроенные шаблоны
В том случае если процессору не удается найти подходящий шаблон для текущего узла, используются так называемые встроенные шаблоны (шаблоны по умолчанию). Существуют встроенные шаблоны для элементов, для режимов, для текстовых узлов и узлов атрибутов, для инструкций обработки и комментариев. Встроенный шаблон для элементов эквивалентен следующему шаблону:
<xsl:template match=“*|/”> <xsl:apply-templates/> </xsl:template> |
Этот шаблон применяется к корневому элементу и ко всем его потомкам (только элементам). Он дает указание процессору идти дальше по дереву и применять шаблоны для всех дочерних узлов текущего элемента. Сам текущий элемент копироваться в конечное дерево или как-то иначе трансформироваться не будет. Встроенный шаблон для режимов применяется в тех случаях, когда процессору не удается найти шаблон с соответствующим режимом. Он эквивалентен следующему шаблону:
<xsl:template match=“*|/” mode=“название_режима”> <xsl:apply-templates mode=“название_режима”/> </xsl:template> |
Встроенный шаблон для текстовых узлов и узлов атрибутов просто копирует текст:
<xsl:template match=“text()|@*”> <xsl:value-of select=“.”/> </xsl:template> |
Встроенный шаблон для инструкций обработки и комментариев не производит никаких действий, т.е. инструкции обработки и комментарии в конечное дерево не переносятся:
<xsl:template match=“processing-instruction()|comment()”/> |
Если в конечное дерево необходимо включить инструкцию обработки или комментарий, то для этого используются специальные инструкции xsl:processing-instruction
и xsl:comment
. Следует особо отметить одну важную особенность: если для элемента не указан шаблон, то будет применен встроенный шаблон, в соответствии с которым и сам элемент и все его потомки будут обработаны соответствующим образом. Но если для элемента задан шаблон, то его потомки войдут в конечное дерево, только если в шаблоне содержится инструкция xsl:apply-templates
. Встроенный шаблоны обрабатываются так, как будто они были неявно импортированы прежде стиля, а потому имеют меньший приоритет импорта, чем все остальные шаблоны. Таким образом, пользователь может переопределить шаблон по умолчанию, явно включив новый шаблон.
Инструкции или правила шаблона
Инструкции или правила шаблона задаются внутри элемента xsl:template
, и отдают процессору указание выполнить определенное действие (преобразование) над исходным элементом. Результат этого действия включается в конечное дерево. Задаются инструкции с помощью следующих элементов:
xsl:apply-templates
xsl:call-template
xsl:element
xsl:attribute
xsl:text
xsl:processing-instruction
xsl:comment
xsl:copy
xsl:value-of
xsl:copy-of
xsl:number
xsl:for-each
xsl:if
xsl:choose
xsl:when
xsl:otherwise
xsl:sort
xsl:message
Фиксированные конечные элементы
Помимо инструкций в шаблоне могут содержаться и другие элементы, не относящиеся к пространству имен XSL (т.е. не являющиеся инструкциями XSL), а введенные пользователем. Как правило, это теги HTML, но не только. По сути, пользователь может включить в шаблон любые элементы с одним ограничением: каждый из них и все они в целом должны соответствовать правилам XML, ведь xsl-документ является xml-документом. Такие элементы, введенные пользователем, получили название фиксированные конечные элементы. Называются они так потому, что переносятся в конечное дерево без каких-либо изменений. Их содержимым (т.е. потомками) могут являться как другие фиксированные конечные элементы, в том числе текстовые (т.е. просто текст), так и инструкции XSL. Инструкции в этом случае, как обычно, будут обрабатываться процессором, а фиксированные конечные элементы просто переноситься в него без изменений.
Шаблон значения атрибута
Значением атрибутов фиксированных конечных элементов может быть как просто текст, который без изменений будет переноситься в конечное дерево, так и выражения на языке XPath. В последнем случае выражение будет обработано процессором, и в конечное дерево будет включен его результат. Однако, в данном случае, чтобы процессор смог отличить просто текст от выражения XPath, последнее нужно заключать в фигурные скобки: {}
. Подобное значение атрибутов, представляющее собой выражение XPath, заключенное в фигурные скобки, получило название шаблон значения атрибута.
-
Доступные статьи
-
XML
-
XSLT первый шаг
- Введение
- Валидный XHTML
- XSLT-преобразования
- Приложение
- Ссылки на исходный код
- Использование PHP5 для обработки XSLT
- Мысли вслух
1. Введение
Не прошло и трёх лет с тех пор, как у меня зародилась мысль о том, что пора изучать XSLT -))). Мысль зародилась, а везде ещё стоял PHP 4 и зверствовал Salbotron
, который, мягко говоря, не отличался высокой производительностью. Да и редко какой браузер мог похвастаться поддержкой этого самого XSLT. По этим соображениям изучение столь перспективного направления я отложил до лучших времён. На данный момент можно смело заявить, что эти времена настали, поскольку вышел PHP 5 с поддержкой XSLT и сносной объектной моделью, а все топовые браузеры уже сами уверенно держат преобразования, только подавай XML. 🙂
Важные ссылки по теме, первоисточники:
- http://w3c.org – комитет по разработке и продвижению стандартов всемирной паутины Internet. На данный момент он является первоисточником практически всех веб-ориентированных стандартов и рекомендаций.
- http://www.w3.org/TR/xml – спецификация расширяемого языка разметки XML, который является основой современного веба. На момент написания статьи доступна пятая редакция версии 1.0, а также вторая редакция версии 1.1.
- http://www.w3.org/TR/xml-names – спецификация использования пространств имён в XML.
- http://www.w3.org/TR/xpath – спецификация по использованию языка поиска частей XML-документа XPath.
- http://www.w3.org/TR/xsl/ – спецификация расширенного языка стилей XSL.
- http://www.w3.org/TR/xslt – спецификация языка преобразований XSLT.
- http://validator.w3.org/ – валидатор HTML.
- http://www.w3.org/TR/xhtml1/ – спецификация XHTML1.0.
Переводы на русский язык:
- http://www.rol.ru/news/it/helpdesk/xml01.htm – Расширяемый язык разметки XML1.0 (вторая редакция). /Радик Усманов/
- http://www.rol.ru/news/it/helpdesk/xnamsps.htm – Пространства имен в XML. /Радик Усманов/
- http://www.rol.ru/news/it/helpdesk/xpath01.htm – Язык XML Path (XPath). /Радик Усманов/
- http://www.rol.ru/news/it/helpdesk/xslt01.htm – Язык преобразований XSL (XSLT). /Радик Усманов/
Для лучшего понимания всего происходящего я рекомендую читать спецификации в следующем порядке:
- XML (это основа!)
- пространства имён (механизм разнородного XML-кода в одном файле)
- XPath (язык выборки элементов из дерева структуры)
- XSLT (преобразования)
- XHTML (то, к чему нужно стремиться)
Особо пытливые могут также уделить внимание расширенному языку стилей XSL.
2. Валидный XHTML
Что такое валидный XHTML? В первую очередь, это XML-документ, который должен соответствовать спецификации XML. Во-вторую, почти обычная HTML-страница, к которой все привыкли.
Почему нужен именно XHTML? Исключительно из соображений совместимости и кросс-браузерности. Страница в XHTML будет с большей вероятностью отображаться корректно в популярных браузерах, чем обычный HTML.
Для рядового клепателя страниц словосочетание XML-документ должно означать следующее:
- Документ содержит объявление XML-документа в самом начале страницы:
<?xml ... ?>
- Документ содержит один корневой элемент, в котором находятся все остальные.
- Все элементы (тэги) должны иметь закрывающую часть (
<br />
,<p>...</p>
). - Атрибуты всегда имеют значение, которое обязательно указывается в кавычках (одинарных или двойных). Например,
<input type="radio" disabled="disabled" />
. - Управляющие символы
&
,<
и>
всегда должны маскироваться. Например,<a href="?a=1&b=2">&</a>
. Исключение составляет только<![CDATA[...]]>
, внутри которого спецсимволы можно не маскировать.
Также сам XHTML обязывает выполнять следующие условия:
- Документ должен объявлять пространство имён, в рамках которого будут использоваться элементы HTML.
- Документ должен объявлять DOCTYPE перед корневым элементом и указывать в нём один из типов XHTML и соответствующий DTD.
Пример простого документа XHTML1.0:
Код - валидный xhtml
|
<?xml version="1.0" encoding="windows-1251"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"> <head> <title>Это валидный XHTML!</title> </head> <body> <p>Привет, мир!</p> </body> </html> |
И так обо всём по порядку.
-
Объявление XML-документа, в котором указывается его версия и кодировка.
<?xml version="1.0" encoding="windows-1251"?>
Для большей безопасности кодировку нужно всегда выставлять, иначе могут возникнуть проблемы с невалидными (по отношению к дефолтной кодировке) символами.
-
Объявление типа документа и его схемы.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Для XHTML 1.0 есть три типа –
Strict
(строгое соответствие рекомендациям W3C),Transitional
(переходный тип) иFrameset
(использование фреймов). Для каждого из них предусмотрен отдельный DTD. -
Объявление пространства имён и используемого языка.
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
Очень важно указывать ссылку именно в таком регистре и никак иначе. Это связано с тем, что в XML имена элементов и содержимое их атрибутов регистрозависимы.
Три версии XHTML1.0 предназначены для лучшей обратной совместимости:
Strict
– обеспечивает наибольшее соответствие рекомендациям W3C со стороны браузеров. Однако и сам HTML-код должен следовать этим рекомендациям.Transitional
– менее строгое соответствие, которое заставляет браузер вести себя так, как если бы это был обычный HTML-документ.Frameset
– позволяет использовать фреймы.
Помимо XHTML1.0 на данный момент доступен XHTML1.1:
<?xml version="1.0" encoding="windows-1251"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"> <head> <title>XHTML1.1</title> </head> <body> <p>Это валидный XHTML1.1!</p> </body> </html>
XHTML1.1 по сути является тем же XHTML1.0 Strict и призван вытеснить другие версии XHTML1.0. Однако, по сравнению с XHTML1.0 Strict, у него есть ряд отличий:
- Удалён атрибут
lang
, его роль выполняетxml:lang
. (Модуль [XHTMLMOD
]) - Для элементов
a
иmap
вместо атрибутаname
нужно использовать атрибутid
. (Модуль [XHTMLMOD
]) - Доступен набор элементов
ruby
. (Модуль [RUBY
])
Итак, если вам нужна наибольшая кросс-браузерность и совместимость с рекомендациями W3C, то XHTML1.1 самое оно!
Из этих соображений результатом моих преобразований будет именно XHTML1.1.
3. XSLT-преобразования
Что такое XSLT? Это язык преобразований XML-документа, который был разработан как часть расширенного языка стилей (XSL).
Зачем нужен XSLT? Он позволяет реализовать схему, при которой данные хранятся отдельно, а их представление отдельно. То есть, один XML-документ преобразуется с помощью другого XML-документа (XSL, в котором находятся XSLT-шаблоны) в конечный документ. Результатом может быть XML, HTML или текстовый документ любого формата.
Для того, чтобы воспользоваться XSLT-преобразованиями, в первую очередь нужно сформировать правильный стиль XSL и подключить его к XML-файлу.
Валидным XSL-документом является XML-документ, у которого задано пространство имён xsl и присутствует корневой элемент stylesheet. В самом простом случае стиль может выглядеть, например, так:
Файл - test.xsl
|
<?xml version="1.0" encoding="windows-1251"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> </xsl:stylesheet> |
Этот стиль не содержит каких-либо явных определений шаблонов или других элементов XSL. Однако, его уже можно использовать. Чтобы посмотреть результат, достаточно сформировать произвольный XML-документ и подключить к нему этот стиль:
Файл - test.xml
|
<?xml version="1.0" encoding="windows-1251"?> <?xml-stylesheet type='text/xsl' href='test.xsl'?> <elements attr1="Главный атрибут"> <element attr1="мой атрибут1" attr2="мой атрибут2">Один</element> <element>Два</element> <element attr5="Халявный атрибут">Три</element> </elements> |
За подключение стиля отвечает строка:
<?xml-stylesheet type='text/xsl' href='test.xsl'?>
Если файлы text.xml
и test.xsl
созданы и находятся в одной папке, то с помощью любого XSLT-парсера можно преобразовать исходный test.xml
в результирующий документ. В качестве парсера могут выступать все популярные браузеры (IE5+, FF2+, Opera9+ и другие), а также модули в языках программирования, например, в PHP. Если вы используете браузер, то достаточно открыть test.xml, и он сразу отобразит примерно такой результат:
При этом кодировка результата будет UTF-8, несмотря на то, что исходный документ был сформирован в windows-1251. К сожалению, браузеры обычно не позволяют просмотреть код результирующего документа, но модуль XSLT в PHP5 даёт возможность передать результирующий код в переменную, которую можно сохранить в файл. Поэтому, используя PHP, я приведу исходный код результирующего документа:
Результат - исходный код
|
|
1 |
<?xml version="1.0"?> Один Два Три |
Этот код не является валидным XML-документом и тем более XHTML1.1. Для того, чтобы сформировать нужный код, я усложню исходный XSL-стиль и добавлю туда необходимые шаблоны и преобразования. При этом исходный XML-документ останется без изменений.
В качестве примера я приведу XSL-стиль, который при помощи XSLT будет выводить список атрибутов исходного XML-документа с их значениями, при этом будет формироваться валидный XHTML1.1. Итак, стиль:
Файл - test.xsl
|
<?xml version="1.0" encoding="windows-1251"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="windows-1251" omit-xml-declaration="no" indent="yes" media-type="text/xml" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" /> <xsl:template match="/"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"> <head> <title>Мой первый XSLT</title> </head> <body> <div><xsl:text>Мой список:</xsl:text></div> <ol> <xsl:for-each select="/descendant-or-self::*/@*"> <li> <xsl:if test="position() mod 2 = 0"> <xsl:attribute name="style">background-color: #eee;</xsl:attribute> </xsl:if> <xsl:value-of select="concat(name(), ' = ', .)" /> </li> </xsl:for-each> </ol> <div> <xsl:text>Разработчик парсера: </xsl:text> <a> <xsl:attribute name="href"> <xsl:value-of select="system-property('xsl:vendor-url')" /> </xsl:attribute> <xsl:attribute name="title"> <xsl:value-of select="system-property('xsl:vendor-url')" /> </xsl:attribute> <xsl:value-of select="system-property('xsl:vendor')" /> </a> </div> </body> </html> </xsl:template> </xsl:stylesheet> |
Чтобы понять, как он работает, я распишу каждое действие отдельно:
-
Объявление XML-документа:
<?xml version="1.0" encoding="windows-1251"?>
Документ сформирован в кодировке windows-1251, о чём сообщается в атрибуте encoding. Версию XML-документа желательно всегда указывать, это рекомендация W3C.
-
Затем идёт объявление корневого элемента, стиля:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Обязательным атрибутом является определение пространства имён xsl через атрибут xmlns:xsl=“http://www.w3.org/1999/XSL/Transform”.
-
Следующим шагом в корневом элементе stylesheet объявляется, каким образом нужно формировать результирующий документ:
<xsl:output method="xml" encoding="windows-1251" omit-xml-declaration="no" indent="yes" media-type="text/xml" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" />
Основные атрибуты:
- method=“xml” – метод вывода документа. Результирующий документ будет в формате XML.
- encoding=“windows-1251” – кодировка результирующего документа.
- omit-xml-declaration=“no” – пропускать или нет начальное объявление XML-документа (
<?xml ... ?>
). Может иметь значение “yes” или “no” (актуально только для html). - indent=“yes” – формировать отступы согласно уровню вложенности. Может иметь значение “yes” или “no”.
- media-type=“text/xml” – MIME-тип результирующего документа (используется только для метода вывода html).
- doctype-public=“-//W3C//DTD XHTML 1.1//EN” – тип результируюшего документа (DOCTYPE)
- doctype-system=“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd” – ссылка на DTD
Если метод вывода объявлен html, то значения атрибутов encoding и media-type будут подставлены в заголовок страницы (
<head>...</head>
) посредством метатега. -
Объявление основного шаблона:
Именно этот XSLT-шаблон соответствует корню исходного дерева и будет вызван первым для преобразования. Атрибут match принимает значения, которые должны соответствовать языку поиска элементов XPath.
Остальные шаблоны, если таковые имеются, должны подключаться из этого шаблона при помощи средств XSLT.
-
Формирование XHTML-страницы. Оно начинается с элемента <html>, у которого указано пространство имён xhtml:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
Атрибут xmlns=“http://www.w3.org/1999/xhtml” указывает на пространство имён xhtml, которое будет применено по умолчанию к этому элементу и всем дочерним элементам, у которых оно не задано явно.
Атрибут xml:lang=“ru” указывает на язык, в котором сформирована страница (будущая).
Эта часть стиля была нужна для формирования атрибутики валидного XHTML1.1 кода.
Теперь что касается XSLT-преобразований:
-
Вставка простого текста:
<div><xsl:text>Мой список:</xsl:text></div>
Текст “Мой список:” будет подставлен в тег
<div>
с маскированием управляющих символов. В принципе, этот код ничего особенно не делает, а стоит просто, как пример. -
Организация цикла по выборке:
<xsl:for-each select="/descendant-or-self::*/@*">
Атрибут select принимает выражение XPath, на основе которого делает выборку. Если выборка вернула список узлов, то начинает работать цикл по каждому элементу.
В данном случае выборка вернёт список атрибутов для этого (корневого) и всех дочерних элементов.
-
Проверка условия:
<xsl:if test="position() mod 2 = 0">
В данном случае проверяется на чётность позиция элемента в списке выборки. Если тест возвращает true (порядковый номер элемента чётный), то срабатывает содержимое этого элемента.
-
Управление атрибутами вышестоящего элемента:
<xsl:attribute name="style">background-color: #eee;</xsl:attribute>
В данном случае, если позиция элемента чётная (определяется вышестоящим if), то в стиль элемента
<li>
будет прописан серый цвет фона. -
Вывод значений элемента:
<xsl:value-of select="concat(name(), ' = ', .)" />
Этот код подставит в вышестоящий элемент строку, собранную из имени текущего элемента и его значения. Содержимое атрибута select соответствует XPath.
-
Вывод ссылки на разработчика парсера XSLT:
<xsl:text>Разработчик парсера: </xsl:text> <a> <xsl:attribute name="href"> <xsl:value-of select="system-property('xsl:vendor-url')" /> </xsl:attribute> <xsl:attribute name="title"> <xsl:value-of select="system-property('xsl:vendor-url')" /> </xsl:attribute> <xsl:value-of select="system-property('xsl:vendor')" /> </a>
Этот небольшой код XSLT формирует ссылку на разработчика парсера XSLT. Во многих случаях она будет разная и содержать разные значения.
Результатом обработки этого стиля (test.xsl
) станет такой код:
Результат - исходный код
|
<?xml version="1.0" encoding="windows-1251"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"> <head> <title>Мой первый XSLT</title> </head> <body> <div>Мой список:</div> <ol> <li>attr1 = Главный атрибут</li> <li style="background-color: #eee;">attr1 = мой атрибут1</li> <li>attr2 = мой атрибут2</li> <li style="background-color: #eee;">attr5 = Халявный атрибут</li> </ol> <div>Разработчик парсера: <a href="http://xmlsoft.org/XSLT/" title="http://xmlsoft.org/XSLT/">libxslt</a></div> </body> </html> |
Этот код соответствует стандарту XHTML1.1 и был сформирован на основе исходного XML-документа. Для проверки можно воспользоваться валидатором от W3C, который расположен по адресу http://validator.w3.org/.
В браузере этот код выглядит примерно так:
IE 6 | FireFox 3 | Opera 9.02 |
---|---|---|
4. Приложение
Ссылки на исходный код
Файл с данными test.xml доступен по адресу //anton-pribora.ru/articles/xml/xslt-first-step/test.xml.
Файл со стилем test.xsl доступен по адресу //anton-pribora.ru/articles/xml/xslt-first-step/test.xsl.
Исходный код примера на PHP5 //anton-pribora.ru/articles/xml/xslt-first-step/test.phps.
Постоянный адрес статьи //anton-pribora.ru/articles/xml/xslt-first-step/. /Автор: Прибора Антон Николаевич, 2009 год/
Использование PHP5 для обработки XSLT
Для получения результирующего документа при помощи PHP5 я использовал такой код:
Пример - использование XSLT в PHP5
|
<?php // Вывод кода HTML в виде текста header('Content-Type: text/plain;'); // Объект исходного XML-документа $xml = new DOMDocument(null, 'windows-1251'); $xml->load('test.xml'); // Объект стиля $xsl = new DOMDocument(null, 'windows-1251'); $xsl->load('test.xsl'); // Создание парсера $proc = new XSLTProcessor(); // Подключение стиля к парсеру $proc->importStylesheet($xsl); // Обработка парсером исходного XML-документа $parsed = $proc->transformToXml($xml); // Вывод результирующего кода echo $parsed; // Запись файла с результирующим кодом file_put_contents('parsed.html', $parsed); ?> |
Дополнительную информацию по использованию XSLT в PHP5 можно найти по адресу http://ru2.php.net/manual/ru/book.xslt.php.
Мысли вслух
«Товарищи, мы стоим на краю огромной пропасти! И я предлагаю сделать большой, решительный шаг вперёд!»
См. также “Подключение мобильных версий шаблонов”.
Все XSLT-шаблоны размещаются в папке ~/xsltTpls
корневой папки сайта. Рассмотрим процедуру создания и подключения на примере тестового XSLT-шаблона:
-
Создадим в папке ~/
xsltTpls
шаблонmytemplate.xsl
следующего содержания:Замечание
В названии файла шаблона нельзя использовать русские буквы!
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="utf-8"/> <xsl:template match="/"> <html> <head> <title></title> </head> <body> ...тестируем шаблон... </body> </html> </xsl:template> </xsl:stylesheet>
Обратите внимание, что файлы шаблонов, как и большинство файлов системы, необходимо сохранять в кодировке
UTF-8
! -
Для подключения шаблона откроем модуль «Структура» и перейдем по ссылке «Настройки модуля». Далее на вкладке «Управление шаблонами» в самой нижней, пустой строке введем название шаблона, например «Тестовый XSLT-шаблон», и имя файла —
mytemplate.xsl
(Рисунок 2.4, «Подключение XSLT-шаблона»). Нажмем кнопку Сохранить.Рисунок 2.4. Подключение XSLT-шаблона
-
Создадим новую страницу с использованием шаблона
mytemplate.xsl
. Для этого откроем модуль «Структура», выделим название домена, и нажмем верхнем наборе пиктограмм иконку (добавить подстраницу) . В окне редактирования страницы заполним параметры страницы и в поле «Шаблон дизайна» выберем из списка значение «Тестовый XSLT-шаблон»:Рисунок 2.5. Создание страницы с использованием XSLT-шаблона
-
Нажмем кнопку Добавить и посмотреть. Если вы увидите на странице текст «…тестируем шаблон…», значит, XSLT-шаблон подключен успешно.
Замечание
Вы можете поменять шаблон для уже созданных страниц непосредственно из дерева сайта в модуле “Структура”. Для этого надо выделить страницу и в верхнем наборе пиктограмм выбрать в пункте “Шаблон дизайна” новый шаблон.
Итак, мы научились создавать и применять простейший XSLT-шаблон. В следующих разделах мы расскажем, как добавить в этот шаблон элементы, предоставляемые системой UMI.CMS.
XSLT Обзор
Прежде чем изучать XSLT, мы должны сначала понять XSL, что означает E X X- LX. Это похоже на XML, как CSS на HTML.
Нужен для XSL
В случае HTML-документа предварительно определены теги, такие как таблица, div и span; и браузер знает, как добавить стиль к ним и отобразить те, которые используют стили CSS. Но в случае документов XML теги не предопределены. Чтобы понять и оформить XML-документ, Консорциум World Wide Web (W3C) разработал XSL, который может выступать в качестве языка таблиц стилей на основе XML. Документ XSL определяет, как браузер должен отображать документ XML.
Ниже приведены основные части XSL –
-
XSLT – используется для преобразования XML-документа в различные другие типы документов.
-
XPath – используется для навигации по документу XML.
-
XSL-FO – используется для форматирования документа XML.
XSLT – используется для преобразования XML-документа в различные другие типы документов.
XPath – используется для навигации по документу XML.
XSL-FO – используется для форматирования документа XML.
Что такое XSLT
XSLT, Преобразования расширяемого языка таблиц стилей, предоставляет возможность автоматического преобразования данных XML из одного формата в другой.
Как работает XSLT
Таблица стилей XSLT используется для определения правил преобразования, которые будут применяться к целевому документу XML. Таблица стилей XSLT написана в формате XML. XSLT Processor берет таблицу стилей XSLT и применяет правила преобразования к целевому XML-документу, а затем генерирует отформатированный документ в форме XML, HTML или текстового формата. Этот форматированный документ затем используется средством форматирования XSLT для генерации фактического вывода, который должен отображаться конечному пользователю.
преимущества
Вот преимущества использования XSLT –
-
Независимо от программирования. Преобразования записываются в отдельный файл xsl, который снова является документом XML.
-
Вывод можно изменить, просто изменив преобразования в файле xsl. Нет необходимости менять код. Таким образом, веб-дизайнеры могут редактировать таблицу стилей и быстро увидеть изменения в выводе.
Независимо от программирования. Преобразования записываются в отдельный файл xsl, который снова является документом XML.
Вывод можно изменить, просто изменив преобразования в файле xsl. Нет необходимости менять код. Таким образом, веб-дизайнеры могут редактировать таблицу стилей и быстро увидеть изменения в выводе.
Синтаксис XSLT
Предположим, у нас есть следующий пример XML-файла student.xml, который необходимо преобразовать в хорошо отформатированный HTML-документ.
students.xml
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
Нам нужно определить документ таблицы стилей XSLT для вышеуказанного XML-документа, чтобы он соответствовал следующим критериям:
-
Страница должна иметь название Студенты .
-
Страница должна иметь таблицу данных о студентах.
-
Столбцы должны иметь следующие заголовки: № броска, Имя, Фамилия, Ник, Марки
-
Таблица должна содержать информацию о студентах соответственно.
Страница должна иметь название Студенты .
Страница должна иметь таблицу данных о студентах.
Столбцы должны иметь следующие заголовки: № броска, Имя, Фамилия, Ник, Марки
Таблица должна содержать информацию о студентах соответственно.
Шаг 1. Создайте документ XSLT
Создайте документ XSLT, отвечающий указанным выше требованиям, назовите его как Students.xsl и сохраните его в том же месте, где находится student.xml.
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?> <!-- xsl stylesheet declaration with xsl namespace: Namespace tells the xlst processor about which element is to be processed and which is used for output purpose only --> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <!-- xsl template declaration: template tells the xlst processor about the section of xml document which is to be formatted. It takes an XPath expression. In our case, it is matching document root element and will tell processor to process the entire document with this template. --> <xsl:template match = "/"> <!-- HTML tags Used for formatting purpose. Processor will skip them and browser will simply render them. --> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <!-- for-each processing instruction Looks for each element matching the XPath expression --> <xsl:for-each select="class/student"> <tr> <td> <!-- value-of processing instruction process the value of the element matching the XPath expression --> <xsl:value-of select = "@rollno"/> </td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Шаг 2. Свяжите документ XSLT с документом XML
Обновите файл student.xml следующим тегом xml-stylesheet. Установите значение href для Students.xsl
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> ... </class>
Шаг 3. Просмотр XML-документа в Internet Explorer
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
Выход
XSLT <шаблон>
<xsl: template> определяет способ повторного использования шаблонов для генерации желаемого вывода для узлов определенного типа / контекста.
декларация
Ниже приводится объявление синтаксиса элемента <xsl: template> .
<xsl:template name = Qname match = Pattern priority = number mode = QName > </xsl:template>
Атрибуты
Sr.No | Имя и описание |
---|---|
1 |
название Имя элемента, к которому должен быть применен шаблон. |
2 |
матч Шаблон, который обозначает элемент (ы), к которому должен быть применен шаблон. |
3 |
приоритет Приоритетный номер шаблона. Соответствующий шаблон с низким приоритетом не рассматривается перед шаблоном с высоким приоритетом. |
4 |
Режим Позволяет элементу обрабатываться несколько раз, каждый раз получая разные результаты. |
название
Имя элемента, к которому должен быть применен шаблон.
матч
Шаблон, который обозначает элемент (ы), к которому должен быть применен шаблон.
приоритет
Приоритетный номер шаблона. Соответствующий шаблон с низким приоритетом не рассматривается перед шаблоном с высоким приоритетом.
Режим
Позволяет элементу обрабатываться несколько раз, каждый раз получая разные результаты.
элементы
Количество вхождений | неограниченный |
---|---|
Родительские элементы |
xsl: таблица стилей, xsl: transform |
Дочерние элементы |
xsl: apply-import, xsl: apply-templates, xsl: атрибут, xsl: шаблон вызова, xsl: выбор, xsl: комментарий, xsl: копирование, xsl: copy-of, xsl: элемент, xsl: отступление, xsl: for-each, xsl: if, xsl: message, xsl: номер, xsl: param, xsl: инструкция обработки, xsl: текст, xsl: value-of, xsl: переменная, выходные элементы |
Родительские элементы
xsl: таблица стилей, xsl: transform
Дочерние элементы
xsl: apply-import, xsl: apply-templates, xsl: атрибут, xsl: шаблон вызова, xsl: выбор, xsl: комментарий, xsl: копирование, xsl: copy-of, xsl: элемент, xsl: отступление, xsl: for-each, xsl: if, xsl: message, xsl: номер, xsl: param, xsl: инструкция обработки, xsl: текст, xsl: value-of, xsl: переменная, выходные элементы
Демо-пример
Это шаблонное правило имеет шаблон, который идентифицирует элементы <student> и создает выходные данные в табличном формате.
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students_imports.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> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Выход
XSLT <значение-из>
Тег <xsl: value-of> помещает значение выбранного узла в соответствии с выражением XPath в виде текста.
декларация
Ниже приводится объявление синтаксиса элемента <xsl: value-of> .
<xsl:value-of select = Expression disable-output-escaping = "yes" | "no" > </xsl:value-of>
Атрибуты
Sr.No | Имя и описание |
---|---|
1 |
Выбрать Выражение XPath для оценки в текущем контексте. |
2 |
Disable-outputescaping Default- “нет”. Если «да», выходной текст не будет экранировать символы XML от текста. |
Выбрать
Выражение XPath для оценки в текущем контексте.
Disable-outputescaping
Default- “нет”. Если «да», выходной текст не будет экранировать символы XML от текста.
элементы
Количество вхождений | неограниченный |
---|---|
Родительские элементы |
xsl: attribute, xsl: comment, xsl: copy, xsl: element, xsl: fallback, xsl: for-each, xsl: if, xsl: message, xsl: иначе, xsl: param, xsl: инструкция по обработке, xsl: template , xsl: variable, xsl: when, xsl: with-param, выходные элементы |
Дочерние элементы |
Никто |
Родительские элементы
xsl: attribute, xsl: comment, xsl: copy, xsl: element, xsl: fallback, xsl: for-each, xsl: if, xsl: message, xsl: иначе, xsl: param, xsl: инструкция по обработке, xsl: template , xsl: variable, xsl: when, xsl: with-param, выходные элементы
Дочерние элементы
Никто
Демо-пример
В этом примере создается таблица элемента <student> с его атрибутом rollno и его дочерним элементом <firstname>, <lastname>, <nickname> и <marks>.
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.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> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Проверьте вывод
XSLT <для каждого>
Тег <xsl: for-each> применяет шаблон повторно для каждого узла.
декларация
Ниже приводится объявление синтаксиса элемента <xsl: for-each>
<xsl:for-each select = Expression > </xsl:for-each>
Атрибуты
Sr.No | Имя и описание |
---|---|
1 |
Выбрать Выражение XPath для оценки в текущем контексте, чтобы определить набор узлов, подлежащих итерации. |
Выбрать
Выражение XPath для оценки в текущем контексте, чтобы определить набор узлов, подлежащих итерации.
элементы
Количество вхождений | неограниченный |
---|---|
Родительские элементы |
xsl: attribute, xsl: comment, xsl: copy, xsl: element, xsl: fallback, xsl: foreach, xsl: if, xsl: message, xsl: иначе, xsl: param, xsl: инструкция по обработке, xsl: template, xsl: переменная, xsl: when, xsl: with-param, выходные элементы. |
Дочерние элементы |
xsl: apply-import, xsl: apply-templates, xsl: атрибут, xsl: шаблон вызова, xsl: выбор, xsl: комментарий, xsl: копирование, xsl: copy-of, xsl: элемент, xsl: отступление, xsl: for-each, xsl: if, xsl: message, xsl: number, xsl: инструкция обработки, xsl: sort, xsl: text, xsl: value-of, xsl: variable. |
Родительские элементы
xsl: attribute, xsl: comment, xsl: copy, xsl: element, xsl: fallback, xsl: foreach, xsl: if, xsl: message, xsl: иначе, xsl: param, xsl: инструкция по обработке, xsl: template, xsl: переменная, xsl: when, xsl: with-param, выходные элементы.
Дочерние элементы
xsl: apply-import, xsl: apply-templates, xsl: атрибут, xsl: шаблон вызова, xsl: выбор, xsl: комментарий, xsl: копирование, xsl: copy-of, xsl: элемент, xsl: отступление, xsl: for-each, xsl: if, xsl: message, xsl: number, xsl: инструкция обработки, xsl: sort, xsl: text, xsl: value-of, xsl: variable.
Демо-пример
В этом примере создается таблица элемента <student> с его атрибутом rollno и его дочерними элементами <firstname>, <lastname> <nickname> и <marks> путем итерации по каждому студенту.
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.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> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Выход
XSLT <сортировка>
Тег <xsl: sort> определяет критерии сортировки на узлах.
декларация
Ниже приводится объявление синтаксиса элемента <xsl: sort> .
<xsl:sort select = string-expression lang = { nmtoken } data-type = { "text" | "number" | QName } order = { "ascending" | "descending" } case-order = { "upper-first" | "lower-first" } > </xsl:sort>
Атрибуты
Sr.No | Имя и описание |
---|---|
1 |
Выбрать Ключ сортировки узла. |
2 |
языки Язык алфавита, используемый для определения порядка сортировки. |
3 |
тип данных Тип данных текста. |
4 |
порядок Порядок сортировки. По умолчанию «по возрастанию». |
5 |
Дело порядка Порядок сортировки строк по заглавным буквам. По умолчанию «верхний-первый». |
Выбрать
Ключ сортировки узла.
языки
Язык алфавита, используемый для определения порядка сортировки.
тип данных
Тип данных текста.
порядок
Порядок сортировки. По умолчанию «по возрастанию».
Дело порядка
Порядок сортировки строк по заглавным буквам. По умолчанию «верхний-первый».
элементы
Количество вхождений | неограниченный |
Родительские элементы | xsl: apply-templates, xsl: for-each |
Дочерние элементы | Никто |
Демо-пример
В этом примере создается таблица элемента <student> с его атрибутом rollno и его дочерним элементом <firstname>, <lastname>, <nickname> и <marks> путем итерации по каждому студенту с сортировкой их по имени.
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.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> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <xsl:sort select = "firstname"/> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Выход
XSLT <if>
Тег <xsl: if> указывает условный тест на содержание узлов.
декларация
Ниже приводится объявление синтаксиса элемента <xsl: if> .
<xsl:if test = boolean-expression > </xsl:if>
Атрибуты
Sr.No | Имя и описание |
---|---|
1 |
тестовое задание Условие в данных XML для проверки. |
тестовое задание
Условие в данных XML для проверки.
элементы
Количество вхождений | неограниченный |
---|---|
Родительские элементы |
xsl: attribute, xsl: comment, xsl: copy, xsl: element, xsl: fallback, xsl: for-each, xsl: if, xsl: message, xsl: иначе, xsl: param, xsl: инструкция обработки, xsl: шаблон, xsl: variable, xsl: when, xsl: with-param, выходные элементы |
Дочерние элементы |
xsl: apply-templates, xsl: атрибут, xsl: call-template, xsl: выбор, xsl: комментарий, xsl: копия, xsl: copy-of, xsl: элемент, xsl: for-each, xsl: if, xsl: инструкция обработки, xsl: текст, xsl: значение-значения, xsl: переменная, выходные элементы |
Родительские элементы
xsl: attribute, xsl: comment, xsl: copy, xsl: element, xsl: fallback, xsl: for-each, xsl: if, xsl: message, xsl: иначе, xsl: param, xsl: инструкция обработки, xsl: шаблон, xsl: variable, xsl: when, xsl: with-param, выходные элементы
Дочерние элементы
xsl: apply-templates, xsl: атрибут, xsl: call-template, xsl: выбор, xsl: комментарий, xsl: копия, xsl: copy-of, xsl: элемент, xsl: for-each, xsl: if, xsl: инструкция обработки, xsl: текст, xsl: значение-значения, xsl: переменная, выходные элементы
Демо-пример
В этом примере создается таблица элемента <student> с его атрибутом rollno и его дочерним элементом <firstname>, <lastname>, <nickname> и <marks> путем итерации по каждому студенту. Он проверяет отметки, чтобы быть больше 90, а затем печатает данные студента (ов).
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.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> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <xsl:if test = "marks > 90"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:if> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Выход
XSLT <выбрать>
Тег <xsl: choose> задает несколько условных проверок содержимого узлов вместе с элементами <xsl: else> и <xsl: when>.
декларация
Ниже приводится объявление синтаксиса элемента <xsl: choose> .
<xsl:choose > </xsl:choose>
элементы
Количество вхождений | неограниченный |
---|---|
Родительские элементы |
xsl: attribute, xsl: comment, xsl: copy, xsl: element, xsl: fallback, xsl: for-each, xsl: if, xsl: message, xsl: иначе, xsl: param, xsl: инструкция обработки, xsl: шаблон, xsl: variable, xsl: when, xsl: with-param, выходные элементы |
Дочерние элементы |
xsl: в противном случае xsl: когда |
Родительские элементы
xsl: attribute, xsl: comment, xsl: copy, xsl: element, xsl: fallback, xsl: for-each, xsl: if, xsl: message, xsl: иначе, xsl: param, xsl: инструкция обработки, xsl: шаблон, xsl: variable, xsl: when, xsl: with-param, выходные элементы
Дочерние элементы
xsl: в противном случае xsl: когда
Демо-пример
В этом примере создается таблица элемента <student> с его атрибутом rollno и его дочерним элементом <firstname>, <lastname>, <nickname> и <marks> путем итерации по каждому студенту. Он проверяет, а затем печатает детали оценки.
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.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> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> <th>Grade</th> </tr> <xsl:for-each select = "class/student"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> <td> <xsl:choose> <xsl:when test = "marks > 90"> High </xsl:when> <xsl:when test = "marks > 85"> Medium </xsl:when> <xsl:otherwise> Low </xsl:otherwise> </xsl:choose> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Выход
XSLT <ключ>
Элемент тега <xsl: key> указывает именованную пару имя-значение, назначенную определенному элементу в документе XML. Этот ключ используется с функцией key () в выражениях XPath для доступа к назначенным элементам в документе XML.
декларация
Ниже приводится объявление синтаксиса элемента <xsl: key> .
<xsl:key name = QName match = Pattern use = Expression > </xsl:key>
Атрибуты
S.No | Имя и описание |
---|---|
1 |
название Название ключа, который будет использоваться. |
2 |
Матч Шаблоны, используемые для идентификации узла, который содержит этот ключ. |
3 |
использование Выражение XPath для определения значения узлов документа xml. |
название
Название ключа, который будет использоваться.
Матч
Шаблоны, используемые для идентификации узла, который содержит этот ключ.
использование
Выражение XPath для определения значения узлов документа xml.
элементы
Количество вхождений | неограниченный |
Родительские элементы | XSL: таблицы стилей |
Дочерние элементы | Никто |
Демо-пример
В этом примере создается таблица элемента <student> с его атрибутом rollno и его дочерним элементом <firstname>, <lastname>, <nickname> и <marks> путем итерации по каждому студенту. Он проверяет ключ как имя, чтобы быть одним из имени студента, а затем печатает данные студента.
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.xsl
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:key name = "firstname-search" match = "student" use = "firstname"/> <xsl:template match = "/"> <html> <body> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "key('firstname-search', 'Dinkar')"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Выход
XSLT <сообщение>
Элемент тега <message> помогает отлаживать обработку XSLT. Это похоже на предупреждения JavaScript. Тег <xsl:> буферизует сообщение процессору XSLT, который завершает обработку и отправляет сообщение в приложение вызывающей стороны для отображения сообщения об ошибке.
декларация
Ниже приводится объявление синтаксиса элемента <xsl: message> .
<xsl:message terminate = "yes" | "no" > </xsl:message>
Атрибуты
Sr.No | Имя и описание |
---|---|
1 |
прекратить Он указывает, должно ли преобразование завершаться при выполнении этой инструкции или нет. По умолчанию «да». |
прекратить
Он указывает, должно ли преобразование завершаться при выполнении этой инструкции или нет. По умолчанию «да».
элементы
Количество вхождений | неограниченный |
---|---|
Родительские элементы |
xsl: attribute, xsl: comment, xsl: copy, xsl: element, xsl: fallback, xsl: foreach, xsl: if, xsl: message, xsl: иначе, xsl: param, xsl: инструкция по обработке, xsl: template, xsl: переменная, xsl: when, xsl: with-param, выходные элементы |
Дочерние элементы |
xsl: apply-templates, xsl: атрибут, xsl: call-template, xsl: выбор, xsl: комментарий, xsl: копия, xsl: copy-of, xsl: элемент, xsl: for-each, xsl: if, xsl: инструкция обработки, xsl: текст, xsl: значение-значения, xsl: переменная, выходные элементы |
xsl: attribute, xsl: comment, xsl: copy, xsl: element, xsl: fallback, xsl: foreach, xsl: if, xsl: message, xsl: иначе, xsl: param, xsl: инструкция по обработке, xsl: template, xsl: переменная, xsl: when, xsl: with-param, выходные элементы
Дочерние элементы
xsl: apply-templates, xsl: атрибут, xsl: call-template, xsl: выбор, xsl: комментарий, xsl: копия, xsl: copy-of, xsl: элемент, xsl: for-each, xsl: if, xsl: инструкция обработки, xsl: текст, xsl: значение-значения, xsl: переменная, выходные элементы
Демо-пример
В этом примере создается таблица элемента <student> с его атрибутом rollno и его дочерним элементом <firstname>, <lastname>, <nickname> и <marks> путем итерации по каждому студенту. Он проверяет наличие ключа в качестве имени и затем печатает сведения об ученике, в противном случае отображается сообщение об ошибке.
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname></firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.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> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <xsl:if test = "firstname = ''"> <xsl:message terminate = "yes">A first name field is empty. </xsl:message> </xsl:if> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Выход
XSLT <apply-template>
Тег <xsl: apply-template> сигнализирует процессору XSLT найти подходящий шаблон для применения на основе типа и контекста каждого выбранного узла.
декларация
Ниже приводится объявление синтаксиса элемента <xsl: apply-template> .
<xsl:apply-template select = Expression mode = QName > </xsl:apply-template>
Атрибуты
Sr.No | Имя и описание |
---|---|
1 |
Выбрать Используется для обработки узлов, выбранных выражением XPath, вместо обработки всех дочерних элементов. |
2 |
Режим Позволяет элементу, указанному в его квалифицированных именах, обрабатываться несколько раз, каждый раз получая разные результаты. |
Выбрать
Используется для обработки узлов, выбранных выражением XPath, вместо обработки всех дочерних элементов.
Режим
Позволяет элементу, указанному в его квалифицированных именах, обрабатываться несколько раз, каждый раз получая разные результаты.
элементы
Количество вхождений | неограниченный |
---|---|
Родительские элементы |
xsl: attribute, xsl: comment, xsl: copy, xsl: element, xsl: fallback, xsl: foreach, xsl: if, xsl: message, xsl: иначе, xsl: param, xsl: инструкция по обработке, xsl: template, xsl: переменная, xsl: when, xsl: with-param, выходные элементы |
Дочерние элементы |
xsl: sort, xsl: with-param |
Родительские элементы
xsl: attribute, xsl: comment, xsl: copy, xsl: element, xsl: fallback, xsl: foreach, xsl: if, xsl: message, xsl: иначе, xsl: param, xsl: инструкция по обработке, xsl: template, xsl: переменная, xsl: when, xsl: with-param, выходные элементы
Дочерние элементы
xsl: sort, xsl: with-param
Демо-пример
В этом примере создается список элемента <student> с его атрибутом rollno и его дочерним элементом <firstname>, <lastname>, <nickname> и <marks> путем итерации по каждому студенту.
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.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> <h2>Students</h2> <xsl:apply-templates select = "class/student" /> </body> </html> </xsl:template> <xsl:template match = "class/student"> <xsl:apply-templates select = "@rollno" /> <xsl:apply-templates select = "firstname" /> <xsl:apply-templates select = "lastname" /> <xsl:apply-templates select = "nickname" /> <xsl:apply-templates select = "marks" /> <br /> </xsl:template> <xsl:template match = "@rollno"> <span style = "font-size = 22px;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> <xsl:template match = "firstname"> First Name:<span style = "color:blue;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> <xsl:template match = "lastname"> Last Name:<span style = "color:green;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> <xsl:template match = "nickname"> Nick Name:<span style = "color:red;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> <xsl:template match = "marks"> Marks:<span style = "color:gray;"> <xsl:value-of select = "." /> </span> <br /> </xsl:template> </xsl:stylesheet>
Выход
XSLT <импорт>
Тег <xsl: import> импортирует содержимое одной таблицы стилей в другую. Импорт таблицы стилей имеет более высокий приоритет по сравнению с импортированной таблицей стилей.
декларация
Ниже приводится объявление синтаксиса элемента <xsl: import> .
<xsl:import href = "uri"> </xsl:import>
Атрибуты
Sr.No | Имя и описание |
---|---|
1. |
HREF используется для передачи пути таблицы стилей xslt для импорта , |
HREF
используется для передачи пути таблицы стилей xslt для импорта
элементы
Количество вхождений | неограниченный |
Родительские элементы | xsl: таблица стилей, xsl: transform |
Дочерние элементы | никто |
Демо-пример
В этом примере создается список элемента <student> с его атрибутом rollno и его дочерним элементом <firstname>, <lastname>, <nickname> и <marks> путем итерации по каждому студенту. Здесь мы создали две таблицы стилей xsl, где таблица стилей student_imports.xsl импортирует student.xsl, а student.xml связана с student_imports.xsl.
students.xml
<?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students_imports.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class>
students.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> <h2>Students</h2> <table border = "1"> <tr bgcolor = "#9acd32"> <th>Roll No</th> <th>First Name</th> <th>Last Name</th> <th>Nick Name</th> <th>Marks</th> </tr> <xsl:for-each select = "class/student"> <tr> <td><xsl:value-of select = "@rollno"/></td> <td><xsl:value-of select = "firstname"/></td> <td><xsl:value-of select = "lastname"/></td> <td><xsl:value-of select = "nickname"/></td> <td><xsl:value-of select = "marks"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
students_imports.xsl