Учебное пособие (1075724), страница 11
Текст из файла (страница 11)
2.18. Результат выполнения примера 2.8.Файл math.xsl содержит шаблоны для всех трех элементов op, а файлstring.xsl содержит шаблоны только для двух элементов. Так как строка<xsl:import href="string.xsl"/>указана в файле преобразования позднее, чем строка<xsl:import href="math.xsl"/>то «строковые» шаблоны имеют больший приоритет, чем «математические».Если строки поменять местами, то результат выполнения будет следующим:Рис. 2.19.
Результат выполнения примера 2.8. Изменение 1.В этом случае выполняются все «математические» шаблоны, так как ониимеют больший приоритет, а «строковые» не выполняются.872.2.9 Использование сортировкиДля сортировки используется элемент sort. Этот элемент может быть вложенв элемент for-each (определяет порядок перебора элементов в цикле) или вэлемент apply-templates (определяет порядок вызова шаблонов для элементов).Для элемента sort используются следующие атрибуты: select = XPath-выражение, определяет выражение, по которомупроизводится сортировка. data-type = "text" | "number", тип данных текстовый или числовой. order = "ascending" | "descending", порядок сортировки: по возрастаниюили по убыванию. case-order = "upper-first" | "lower-first", в случае текстовой сортировкиопределяет порядок сортировки заглавных букв.
"upper-first" –заглавные буквы размещаются первыми.В примере также используется элемент variable для создания переменной.Элемент variable может быть использован в виде:<xsl:variable name="название" select="значение"/>или<xsl:variable name="название">значение</xsl:variable>Для обращения к переменным перед названием ставится знак $, например:<xsl:value-of select="$название"/>Основной особенностью переменных в XSLT является то, что их нельзяизменять, фактически они являются константами.
Наиболее часто переменныеиспользуют для удобства программирования, занося в них промежуточныефрагменты документов.Пример 2.9.Файл XSLT:<?xml version="1.0" encoding="Windows-1251"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:template match="/"><!-- Правило обработки корневого элемента XML - документа -->88<HTML><BODY><TABLE BORDER="2"><TR><TH>№</TH><TH>Язык разметки</TH><TH>Год создания</TH><TH>Возраст технологии (лет)</TH></TR><xsl:variable name="LangVar" select="languages"/><!-- В переменную LangVar помещается значение элементаlanguages --><xsl:for-each select="$LangVar/language"><xsl:sort select="howold" data-type="number"order="ascending"/><!-- Перебор в цикле всех элементов language, вложенных в элементlanguages. Сортировка по возрастанию значения элемента howold.
--><TR><TD><xsl:value-of select="@id"/></TD><!-- Выбор значения атрибута id элемента language --><TD><xsl:value-of select="name"/></TD><!-- Выбор значения элемента name, вложенного в элемент language --><TD><xsl:value-of select="year"/></TD><!-- Выбор значения элемента year, вложенного в элемент language --><TD><xsl:value-of select="howold"/></TD><!-- Выбор значения элемента howold, вложенного в элемент language -></TR></xsl:for-each><xsl:for-each select="$LangVar/language"><xsl:sort select="howold" data-type="number"order="descending"/>89<!-- Перебор в цикле всех элементов language, вложенных в элементlanguages.
Сортировка по убыванию howold. --><TR><TD><xsl:value-of select="@id"/></TD><!-- Выбор значения атрибута id элемента language --><TD><xsl:value-of select="name"/></TD><!-- Выбор значения элемента name, вложенного в элемент language --><TD><xsl:value-of select="year"/></TD><!-- Выбор значения элемента year, вложенного в элемент language --><TD><xsl:value-of select="howold"/></TD><!-- Выбор значения элемента howold, вложенного в элемент language -></TR></xsl:for-each></TABLE><hr/><xsl:apply-templates select="languages/language"><xsl:sort select="name" data-type="text"case-order="upper-first"/><!-- Сортировка первого уровня по элементу name --><xsl:sort select="howold" data-type="number"order="descending"/><!-- Если значения элементов name совпадают, то сортировкавторого уровня по элементу howold --><!-- Элементы sort вложены в элемент apply-templates --></xsl:apply-templates></BODY></HTML></xsl:template><!-- ++++++++++++++++++++++++++++++++++++++++++++++++--><!-- Шаблон обработки элемента language --><xsl:template match="language"><!-- Получение значения атрибута id (префикс @ означает атрибут) -->90<B>Номер: <xsl:value-of select="@id"/></B><BR/><!-- Вызов шаблонов для элементов name, year и howold --><xsl:apply-templates/><HR/></xsl:template><!-- ++++++++++++++++++++++++++++++++++++++++++++++++--><!-- ++++++++++++++++++++++++++++++++++++++++++++++++--><!-- Шаблон обработки элемента name --><xsl:template match="name">Наименование языка: <B><xsl:value-of select="."/></B><BR/><!-- select="." - получение значения текущего элемента --></xsl:template><!-- ++++++++++++++++++++++++++++++++++++++++++++++++--><!-- ++++++++++++++++++++++++++++++++++++++++++++++++--><!-- Шаблон обработки элемента year --><xsl:template match="year">Год создания: <U><xsl:value-of select="."/></U><BR/></xsl:template><!-- ++++++++++++++++++++++++++++++++++++++++++++++++--><!-- ++++++++++++++++++++++++++++++++++++++++++++++++--><!-- Шаблон обработки элемента howold --><xsl:template match="howold">Возраст технологии (лет): <I><xsl:value-ofselect="."/></I><BR/></xsl:template><!-- ++++++++++++++++++++++++++++++++++++++++++++++++--></xsl:stylesheet>Просмотр результата в браузере:91Рис.
2.20. Результат выполнения примера 2.9.2.2.10 Формирование текстового документаДля указания типа выходного документа используется элемент xsl:output сатрибутом method="тип документа".В следующем примере формируется текстовый документ:Пример 2.10.Файл XSLT:<?xml version="1.0" encoding="Windows-1251"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:output method="text" encoding="Windows-1251"/>92<!-- output определяет формат выходного документа.Атрибут method="text" - выходной документ задается как текст(возможны также значения "xml", "html")Атрибут encoding задает кодировку выходного документа --><xsl:template match="/"><!-- Правило обработки корневого элемента XML - документа --><xsl:for-each select="languages/language"><!-- Перебор в цикле всех элементов language, вложенных вэлемент languages.
--><xsl:text><</xsl:text><!-- text формирует текстовый узел в выходном документе.В этом примере формируется тэговая скобка --><xsl:value-of select="@id"/>,<xsl:value-of select="name"/>,<xsl:value-of select="year"/>,<xsl:value-of select="howold"/><xsl:text>></xsl:text></xsl:for-each></xsl:template></xsl:stylesheet>Просмотр результата в браузере:Рис. 2.21. Результат выполнения примера 2.10.93Формирование текстового документа может быть полезно, например, в томслучае, когда необходимо сгенерировать на основе XML-документа программу накаком-либо языке программирования. Например, можно выгрузить данные из БДв формате XML, и с помощью XSLT-преобразования сгенерировать SQLсценарий на вставку данных в другую БД.2.2.11 Копирование узловКопирование узлов удобно использовать в том случае, когда элементывходного документа нужно поместить в выходной документ без изменений.Для копирования узлов применяют команду<xsl:copy> узлы для копирования </xsl:copy>или команду<xsl:copy-of select="XPath-выражение, задающее узлы длякопирования"/>В следующем примере HTML-фрагменты из элементов text преобразуются вэлементы P (параграф текста).Пример 2.11.Файл XML:<?xml version="1.0" encoding="Windows-1251"?><?xml-stylesheet type="text/xsl" href="copy_of.xsl"?><texts><text>Обычный текст</text><text><b>Полужирный текст</b></text><text><i>Курсив</i></text></texts>Файл XSLT:<?xml version="1.0" encoding="Windows-1251"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">94<xsl:template match="/"><xsl:for-each select="texts/text"><P><xsl:copy-of select="* | text()"/></P></xsl:for-each></xsl:template></xsl:stylesheet>Просмотр результата в браузере:Рис.















