Режимы также очень удобны в том случае, когда требуется обработать один и тот же документ более одного раза; классический пример — создание оглавления.
Следующий пример демонстрирует создание оглавления. Я добавил в
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).
В этой главе мы рассмотрели большую часть базового материала, и в следующей главе я собираюсь уделить внимание созданию полных выражений 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, в которой мы впервые познакомились с атрибутом