Учебное пособие (1075724), страница 10
Текст из файла (страница 10)
2.16. Результат выполнения примера 2.6.77Рассмотрим более подробно текст преобразования 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><LINK href="met.css" rel="stylesheet" type="text/css"/></HEAD><BODY><xsl:comment>Комментарий в выходном документе</xsl:comment>Создание комментария в выходном HTML-документе.
В документе появитсяузел <!-- Комментарий в выходном документе --><xsl:apply-templates select="//language"/>Шаблоны вызываются только для элементов language. Поэтому, в отличие отпредыдущего примера, содержимое других элементов не выводится в выходнойпоток.<!-- Создание элемента с помощью element --><xsl:element name="P" use-attribute-sets="p_attrs"><xsl:attribute name="align">center</xsl:attribute>Параграф текста</xsl:element>Команда element создает элемент в выходном документе. В данном примереэто элемент P. Для него создается атрибут align="center", а также атрибуты изнабора p_attrs.78Обычно с помощью команды 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>Условный оператор choose может содержать множество вложенныхэлементов проверки условия when, а также элемент otherwise, которыйсрабатывает, если не выполняется ни одно условие.Условие указывается в атрибуте test оператора when.
В примере проверяется,что текущее значение элемента name='XML' (name[.='XML']).Условие представляет собой XPath-выражение, которое должно возвращатьлогическое значение. Если условие истинно, то выполняются операторы,вложенные в when.<!-- Вызов шаблонов для элементов name, year --><xsl:apply-templates select="./name"/><xsl:apply-templates select="year"/>79<!-- Вызов шаблона с помощью 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>Шаблон Howold_Function вызывается по имени, как функция.
С помощьюкоманды with-param передаются параметры вызова. В атрибуте name элементаwith-param указывается название параметра. Значение параметра может бытьзадано содержимым элемента или указано в атрибуте select.<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>80Условный оператор if проверяет условие, указанное в атрибуте test.
Еслиусловие истинно, то выполняются операторы, вложенные в if. Оператор if в XSLTне содержит конструкции ELSE. Поэтому вместо него, как правило, используютоператор choose.В нашем примере проверяется, что подстрока, полученная из строки годаменьше чем 1995. Вместо оператора сравнения «<» пишется ссылка на символ<Год создания: <U><xsl:value-of select="."/></U><BR/></div></xsl:template><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- Шаблон обработки элемента howold --><xsl:template name="Howold_Function"><xsl:param name="ParamHowold" select="0"/>В этом примере у шаблона используется не атрибут match, а атрибут name.Такой шаблон вызывается как функция.
Элемент param объявляет параметры,которые могут передаваться в шаблон.У элемента xsl:param атрибут name задает название параметра, а атрибутselect значение по-умолчанию.<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>81</xsl:attribute-set>Набор атрибутов p_attrs содержит два атрибута: title и onclick.
Далее всеатрибуты из этого набора могут быть вставлены в элемент с помощью команды<xsl:element name=" название элемента " use-attribute-sets=" название набораатрибутов ">.<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++--></xsl:stylesheet>2.2.7 Включение стилейВ соответствии со спецификацией [XSLT, 1999], «механизм включениястилей позволяет объединять стили без изменения семантики комбинированныхстилей».Для включения стилей используется элемент xsl:include.Рассмотрим пример включения стилей:Пример 2.7.Файл XML:<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="include.xsl"?><ops><op name="add" symbol="+"><operand>1</operand><operand>2</operand></op></ops>Файл include.xsl:<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:include href="math_include.xsl"/>82Подключение файла с дополнительными шаблонами.<xsl:template match="/"><xsl:apply-templates/></xsl:template>В шаблоне для корневого элемента в результате применения apply-templatesбудет вызван шаблон из файла math_include.xsl.</xsl:stylesheet>Файл math_include.xsl:<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:template match="op[@symbol='+']"><xsl:value-of select="operand[1]"/><xsl:value-of select="@symbol"/><xsl:value-of select="operand[2]"/>=<xsl:value-of select="sum(operand)"/></xsl:template></xsl:stylesheet>Просмотр результата в браузере:Рис.
2.17. Результат выполнения примера 2.7.83Элемент include позволяет включать шаблоны друг в друга. Это может бытьполезно в том случае, когда необходимо создать библиотеку шаблонов вотдельном файле и подключать ее в различные XSLT-преобразования.2.2.8 Импорт стилейВ соответствии со спецификацией [XSLT, 1999], «механизм импорта стилейпозволяет стилям переписывать друг друга».Для импорта стилей используется элемент xsl: import.Рассмотрим пример импорта стилей:Пример 2.8.Файл XML:<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="import.xsl"?><ops><op name="add" symbol="+"><operand>1</operand><operand>2</operand></op><op name="sub" symbol="-"><operand>1</operand><operand>2</operand></op><op name="mul" symbol="*"><operand>1</operand><operand>2</operand></op></ops>Файл import.xsl:<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0">84<xsl:import href="math.xsl"/><!-- С каждой следующей операцией import приоритет повышается --><xsl:import href="string.xsl"/>Так как с каждой следующей операцией import приоритет шаблоновповышается, то шаблоны в файле string.xsl будут иметь больший приоритет, чемшаблоны в файле math.xsl<xsl:template match="op"><xsl:value-of select="operand[1]"/><xsl:value-of select="@symbol"/><xsl:value-of select="operand[2]"/>= <xsl:apply-imports/><br/>Команда apply-imports аналогична команде apply-templates, но она вызываетшаблоны, которые импортированы с помощью import с учетом приоритетаимпортируемых файлов.</xsl:template></xsl:stylesheet>Файл math.xsl:<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:template match="op[@symbol='+']"><xsl:value-of select="sum(operand)"/> (математическое)</xsl:template><xsl:template match="op[@symbol='-']"><xsl:value-of select="number(operand[1])-number(operand[2])"/>(математическое)</xsl:template>85<xsl:template match="op[@symbol='*']"><xsl:value-of select="number(operand[1])*number(operand[2])"/>(математическое)</xsl:template></xsl:stylesheet>Файл string.xsl:<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:template match="op[@name='add']"><xsl:value-of select="operand[1]"/><xsl:value-of select="operand[2]"/>(строковое)</xsl:template><xsl:template match="op[@name='mul']"><xsl:value-of select="operand[2]"/><xsl:value-of select="operand[1]"/>(строковое)</xsl:template></xsl:stylesheet>Просмотр результата в браузере:86Рис.














