Учебное пособие (1075724), страница 9
Текст из файла (страница 9)
Но в отличие от предыдущего примера здесь присутствуют и другиешаблоны.<HTML><HEAD><LINK href="met.css" rel="stylesheet" type="text/css"/>В секции HEAD документа HTML встречается тэг LINK, который связываетHTML-документ с внешней таблицей стилей. После обработки XML-документа спомощью XSLT к полученному HTML-документу будет применена таблицастилей CSS.</HEAD><BODY><xsl:apply-templates/>Главной инструкцией в этом примере является apply-templates. Этаинструкция выполняет следующие действия:1.
В текущем контексте (в текущем тэге) входного документа находит всенепосредственно вложенные элементы.2. Для каждого такого элемента пытается найти соответствующий шаблон(template) и выполнить его. Соответствующим является шаблон вида <xsl:templatematch=" название элемента ">.В нашем примере в корневой элемент непосредственно вложен элементlanguages, поэтому далее будет вызван <xsl:template match="languages">.Обратите внимание, что реальный корневой элемент документа «languages»считается вложенным в корневой элемент «/». Поэтому элементы language невложены непосредственно в «/».68</BODY></HTML></xsl:template><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- Шаблон обработки элемента languages --><xsl:template match="languages"><!-- Вызов шаблона для элемента language (шаблон вызываетсянеобходимое количество раз) --><xsl:apply-templates/>В нашем примере в элемент languages непосредственно вложен элементlanguage, поэтому далее будут вызваны шаблоны <xsl:template match="language">для каждого элемента language.</xsl:template><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- Шаблон обработки элемента language --><xsl:template match="language"><!-- Получение значения атрибута id (префикс @ означает атрибут) --><B>Номер: <xsl:value-of select="@id"/></B><BR/><!-- Вызов шаблонов для элементов name, year и howold --><xsl:apply-templates/>В нашем примере в элемент language непосредственно вложены элементыname, year и howold.
Инструкция apply-templates будет вызывать шаблоны дляэтих элементов.<HR/></xsl:template>69<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- Шаблон обработки элемента name --><xsl:template match="name">Наименование языка: <B><xsl:value-of select="."/></B><BR/>Так как в этом шаблоне мы находимся в контексте элемента name (то естьуже «провалились» внутрь элемента name), то для получения значения текущегоэлемента надо использовать XPath-выражение «.» или «self::*».Если вместо выражения <xsl:value-of select="."/> использовать <xsl:value-ofselect="name"/>, то оно вернет пустое значение, так как будет искатьнесуществующий элемент name внутри текущего элемента name.Шаблоны для элементов year и howold построены аналогично шаблону дляэлемента name.</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>70Отметим, что текстовое содержимое элемента CDATA_Example скопированов выходной поток, что в нашем случае является нежелательным эффектом.Поэтому, в преобразовании лучше создавать шаблоны для всех возможныхэлементов.
Например, если добавить следующий шаблон,<xsl:template match="CDATA_Example"/>то ненужные символы угловых скобок не будут отображаться. Этот шаблонфактически указывает, что для элемента CDATA_Example не нужно выполнятьникаких действий.Вместо этого можно использовать для элемента apply-templates атрибутselect. Этот атрибут содержит XPath-выражение, которое указывает, для какихэлементов нужно искать и выполнять шаблоны.Если в шаблоне обработки корневого элемента команду<xsl:apply-templates/>заменить на<xsl:apply-templates select="//language"/>то элемент CDATA_Example не будет обрабатываться и ненужные символыугловых скобок не будут отображаться.
Так как элемент language не вложеннепосредственно в «/», то используется XPath-выражение «//language», а не«language».Таким образом, можно или создавать шаблоны для всех элементов входногодокумента или указывать область видимости в атрибуте select.В атрибуте select может быть указано произвольное XPath-выражение,которое не обязательно возвращает непосредственно вложенные элементы.Например, если в предыдущем примере указать<xsl:apply-templates select="//name"/>то будут вызваны шаблоны только для элементов name:71Рис. 2.12. Результат выполнения примера 2.5. Изменение 1.Еще одна интересная особенность команды apply-templates состоит в том, чтоона умеет «пропускать» пустые элементы в иерархии.
Например, если изпреобразования удалить шаблоны для languages и language, то команда applytemplates в шаблоне для корневого элемента будет сразу находить шаблоны дляэлементов name, year и howold. Просмотр результата в браузере:Рис. 2.13. Результат выполнения примера 2.5. Изменение 2.72Если из шаблона для элемента languages убрать apply-templates, то шаблоныдля элементов language, name, year и howold вызываться не будут.<xsl:template match="languages"><P>apply-templates не используется</P></xsl:template>Просмотр результата в браузере:Рис. 2.14. Результат выполнения примера 2.5. Изменение 3.Если в исходном документе поменять местами элементы name и year, то этоприведет к перестановке соответствующих строк в выходном HTML-документе,таккакшаблоныдляэтихэлементовбудутвызыватьсявдругойпоследовательности. Просмотр результата в браузере:73Рис.
2.15. Результат выполнения примера 2.5. Изменение 4.Следующее XSLT-преобразование является модификацией предыдущего, внем используются условные операторы, операторы для создания элементов иатрибутов.Пример 2.6.Файл XSLT:<?xml version="1.0" encoding="Windows-1251"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- Шаблон обработки корневого элемента XML - документа --><xsl:template match="/"><HTML><HEAD>74<LINK href="met.css" rel="stylesheet" type="text/css"/></HEAD><BODY><xsl:comment>Комментарий в выходном документе</xsl:comment><xsl:apply-templates select="//language"/><!-- Создание элемента с помощью element --><xsl:element name="P" use-attribute-sets="p_attrs"><xsl:attribute name="align">center</xsl:attribute>Параграф текста</xsl:element></BODY></HTML></xsl:template><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- Шаблон обработки элемента language --><xsl:template match="language"><!-- Получение значения атрибута id (префикс @ означает атрибут) --><xsl:choose><xsl:when test="name[.='XML']"><B><I>Номер: <xsl:value-of select="@id"/></I></B><BR/></xsl:when><xsl:otherwise>Номер: <xsl:value-of select="@id"/><BR/></xsl:otherwise></xsl:choose><!-- Вызов шаблонов для элементов name, year --><xsl:apply-templates select="./name"/><xsl:apply-templates select="year"/>75<!-- Вызов шаблона с помощью xsl:call-template для элементаhowold --><xsl:call-template name="Howold_Function"><!--<xsl:with-param name="ParamHowold" select="./howold"/>-><xsl:with-param name="ParamHowold"><xsl:value-of select="howold"/></xsl:with-param></xsl:call-template><HR/></xsl:template><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- Шаблон обработки элемента name --><xsl:template match="name">Наименование языка: <B><xsl:value-of select="."/></B><BR/><!-- select="." - получение значения текущего элемента --></xsl:template><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- xsl:if – проверка простых условий без ELSE --><!-- Шаблон обработки элемента year --><xsl:template match="year"><div><xsl:if test="number(substring(.,7,4)) < number('1995')"><xsl:attribute name="align">right</xsl:attribute></xsl:if>Год создания: <U><xsl:value-of select="."/></U><BR/></div></xsl:template><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- Шаблон обработки элемента howold -->76<xsl:template name="Howold_Function"><xsl:param name="ParamHowold" select="0"/><I>Возраст технологии (лет): <xsl:value-ofselect="$ParamHowold"/></I><BR/></xsl:template><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--><xsl:attribute-set name="p_attrs"><xsl:attribute name="title">Подсказка</xsl:attribute><xsl:attribute name="onclick">alert('Подсказка')</xsl:attribute></xsl:attribute-set><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--></xsl:stylesheet>Просмотр результата в браузере:Рис.














