XSLT - Стивен Холзнер
Шрифт:
Интервал:
Закладка:
</TR>
<TR>
<TD><B>Earth</B></TD>
<TD><B>1 (Earth = 1)</B></TD>
<TD><B>2107 miles</B></TD>
<TD><B>1 days</B></TD>
</TR>
</TABLE>
</BODY>
</HTML>
Этот документ показан на рис. 6.4.
Рис. 6.4. Применение режимов обработки
Режимы также очень удобны в том случае, когда требуется обработать один и тот же документ более одного раза; классический пример — создание оглавления.
Следующий пример демонстрирует создание оглавления. Я добавил в planets.xml оглавление в элементе <TOC> (table of contents, оглавление), имеющем три элемента <ENTRY> для каждой из планет. Заметьте, что здесь мне необходимо применить два шаблона, выбирающие элементы <PLANET>, — один для создания оглавления и еще один для копирования всех элементов <PLANET> в результирующий документ — я использую режимы для того, чтобы их различать. Начну с установки режима в «toc» и применения шаблона, который поддерживает этот режим и создает оглавление:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http//www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="PLANETS">
<PLANETS>
<TOC>
<xsl:apply-templates mode="toc"/>
</TOC>
.
.
.
</PLANETS>
</xsl:template>
<xsl:template match="PLANET" mode="toc">
<ENTRY>
<xsl:value-of select="NAME"/>
</ENTRY>
</xsl:template>
.
.
.
Затем я применяю общий шаблон без каких-либо режимов обработки ко всем элементам и атрибутам, копируя их в результирующий документ (листинг 6.14).
Листинг 6.14. Создание оглавления<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="PLANETS">
<PLANETS>
<TOC>
<xsl:apply-templates mode="toc"/>
</TOC>
<xsl:apply-templates select="@*|node()"/>
</PLANETS>
</xsl:template>
<xsl:template match="PLANET" mode="toc">
<ENTRY>
<xsl:value-of select="NAME"/>
</ENTRY>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
И, наконец, результат, выводящий planets.xml с оглавлением:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="planets.xsl"?>
<PLANETS>
<TOC>
<ENTRY>Mercury</ENTRY>
<ENTRY>Venus</ENTRY>
<ENTRY>Earth</ENTRY>
</TOC>
<PLANET>
<NAME>Mercury</NAME>
<MASS UNITS="(Earth = 1)">.0553</MASS>
<DAY UNITS="days">58.65</DAY>
<RADIUS UNITS="miles">1516</RADIUS>
<DENSITY UNITS="(Earth = 1)">.983</DENSITY>
<DISTANCE UNITS="million miles">43.4</DISTANCE><!--В перигелии->
</PLANET>
.
.
.
</PLANETS>
В этой главе мы рассмотрели большую часть базового материала, и в следующей главе я собираюсь уделить внимание созданию полных выражений XPath. Хотя вы уже немного знакомы с этой темой по обсуждению образцов выбора в главе 4, нам осталось еще рассмотреть весьма значительную часть.
Глава 7
Работа с XPath
В главе 4 было объяснено, как создавать образцы выбора, которые можно использовать в атрибуте match таких элементов, как <xsl:template>. Образцы являются подмножеством полного языка XPath, и в этой главе будет рассмотрена полная версия XPath.
Выражения XPath применимы в XSLT не только в образцах выбора, но и во многих других приложениях: в атрибуте select элементов <xsl:apply-templates>, <xsl:value-of>, <xsl:for-each>, <xsl:param>, <xsl:variable>, <xsl:with-param>, <xsl:copy-of> и <xsl:sort>, в шаблонах значений атрибутов, в атрибуте test элементов <xsl:if> и <xsl:when>, атрибуте value элемента <xsl:number> и в предикатах образцов выбора. На этот счет не может быть никаких сомнений: пока вы не знаете XPath, вы не знаете XSLT, и вся эта глава посвящена созданию выражений XPath и работе с ними.
Фактически мы работали с выражениями XPath начиная с главы 1, в которой мы впервые познакомились с атрибутом select в элементах <xsl:apply-templates> и <xsl:value-of>:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/PLANETS">
<HTML>
<HEAD>
<TITLE>
The Planets Table
</TITLE>
</HEAD>
<BODY>
<H1>
The Planets Table
</H1>
<TABLE BORDER="2">
<TR>
<TD>Name</TD>
<TD>Mass</TD>
<TD>Radius</TD>
<TD>Day</TD>
</TR>
<xsl:apply-templates/>
</TABLE>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="PLANET">
<TR>
<TD><xsl:value-of select="NAME"/></TD>
<TD><xsl:apply-templates select="MASS"/></TD>
<TD><xsl:apply-templates select="RADIUS"/></TD>
<TD><xsl:apply-templates select="DAY"/></TD>
</TR>
</xsl:template>
<xsl:template match="MASS">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
<xsl:value-of select="@UNITS"/>
</xsl:template>
<xsl:template match="RADIUS">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
<xsl:value-of select="@UNITS"/>
</xsl:template>
<xsl:template match="DAY">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
<xsl:value-of select="@UNITS"/>
</xsl:template>
</xsl:stylesheet>
Изучаем XPath
Хотя мы уже знаем, например, что для обращения к текущему узлу можно присвоить «.» атрибуту select, «.» не является допустимым образцом выбора: это сокращение XPath для self::node(). Применение образцов выбора ограничено только двумя осями: ребенка и атрибута, но в XPath тринадцать осей, включая self. В этой главе мы рассмотрим все эти оси и приемы работы с ними.
Говоря формально, XPath позволяет вам ссылаться на определенные разделы XML-документов — это язык, предназначенный для адресации различных частей таких документов. При помощи XPath вы указываете, с какой частью документа вы хотите работать. Вот что W3C говорит о XPath:
«Основная задача XPath — адресовать части документа XML. Для реализации этой первоочередной цели он также предоставляет основные средства оперирования строками, числами и логическими значениями. XPath обладает компактным, отличным от XML синтаксисом для облегчения его применения в идентификаторах URI и значениях атрибутов XML. XPath работает с абстрактной, логической структурой XML-документа, а не с его внешним синтаксисом. XPath получил свое имя благодаря тому, что для навигации по иерархической структуре XML-документа в нем используется нотация пути (path), как в идентификаторах URI».
Эта цитата взята из спецификации XPath 1.0. Заметьте, что, хотя основной целью XPath является адресация частей XML-документов, он также поддерживает синтаксис для работы со строками, числами и логическими (true/false) значениями, который, как мы увидим, сам по себе очень полезен.
В данный момент стандартом является XPath версии 1.0, но были выпущены требования для XPath 2.0. Пока еще нет рабочих проектов XPath 2.0, есть только список того, что W3C планирует туда включить. В конце главы будет приведен обзор этого списка. Первичные источники XPath вы найдете в двух местах:
• спецификация XPath 1.0. XPath применяется для поиска и указания определенных разделов и элементов в документах XML для дальнейшей работы с ними. www.w3.org/TR/xpath;
• требования XPath 2.0. XPath обновляется и в него включаются дополнительные средства поддержки XSLT 2.0 — в первую очередь поддержка схем XML. www.w3.org/TR/xpath20req.