много примеров.
MICROSOFT И НЕСТАНДАРТНЫЕ ОБРАЗЦЫ ВЫБОРА
Microsoft поддерживает образцы выбора в своем процессоре XML MSXML3, но есть еще кое-что, о чем вам следует знать: с образцами выбора Microsoft использует также весьма много нестандартного, не используемого W3C синтаксиса. В этой главе я собираюсь придерживаться официальной, W3C, версии, и если вам доведется читать документацию Microsoft об образцах выбора, имейте в виду, что многое из этой документации относится только к реализации Microsoft.
Выбор корневого узла
Как вы уже видели, выбрать корневой узел можно при помощи образца выбора «/», как, например:
<xsl:template match='/'>
<HTML>
<xsl:apply-templates/>
</HTML>
</xsl:template>
Выбор элементов
Можно выбирать элементы, просто задавая их имена, как мы уже видели. Следующий шаблон выбирает элементы <PLANETS>
:
<xsl:template match='PLANETS'>
<HTML>
<xsl:apply-templates/>
</HTML>
</xsl:template>
Выбор дочерних элементов
При доступе к дочернему узлу определенного узла для разделения имен элементов можно использовать операцию шага /. Пусть, например, требуется создать правило, которое должно применяться только к тем элементам <NAME>
, которые являются дочерними для элементов <PLANET>
. Для этого можно задать выражение 'PLANET/NAME
'. Вот правило, окружающее текст таких элементов в элемент HTML <Н3>
:
<xsl:template match='PLANET/NAME'>
<H3>
<xsl:value-of select='.'/>
</H3>
</xsl:template>
Можно также использовать символ * в качестве символа-подстановки, что соответствует любому элементу. (* может выбирать только элементы, однако образец @* выбирает любой атрибут.) Например, следующее правило применяется ко всем элементам <NAME>
, которые являются внуками элементов <PLANET>
:
<xsl:template match='PLANET/*/NAME'>
<H3>
<xsl:value-of select='.'/>
</H3>
</xsl:template>
Выбор потомков элемента
В предыдущем разделе при помощи выражения 'PLANET/NAME
' я выбирал все элементы <NAME>
, являющиеся прямыми потомками элементов <PLANET>
, а при помощи выражения 'PLANET/*/NAME
' — все элементы <NAME>
, являющиеся внуками элементов <PLANET>
. Есть, однако, более простой способ выполнить оба выбора — применить выражение 'PLANET//NAME
', выбирающее все элементы <NAME>
, находящиеся внутри элементов <PLANET>
, независимо от глубины вложенности (соответствующие элементы называются потомками элемента <PLANET>
). Иными словами, 'PLANET//NAME
' выбирает 'PLANET/NAME
', 'PLANET/*/NAME
', 'PLANET/*/*/NAME
' и т.д.:
<xsl:template match='PLANETS//NAME'>
<H3>
<xsl:value-of select='.'/>
</H3>
</xsl:template>
Выбор атрибутов
Как было показано в главе 3, «Создание и применение шаблонов», можно выбирать атрибуты, если предварять их имена префиксом @. Вы уже работали с атрибутом UNITS
, который поддерживают большинство детей элементов <PLANET>
:
<PLANET>
<NAME>Earth</NAME>
<MASS UNITS='(Earth = 1)'>1</MASS>
<DAY UNITS='days'>1</DAY>
<RADIUS UNITS='miles'>2107</RADIUS>
<DENSITY UNITS='(Earth = 1)'>1</DENSITY>
<DISTANCE UNITS='million miles'>128.4</DISTANCE><!--B перигелии-- >
</PLANET>
Чтобы извлечь единицы измерения и отобразить их вместе со значениями массы и т.п., можно выбрать атрибут UNITS
при помощи @UNITS
(листинг 4.1).
<?xml version='1.0'?>
<xsl:stylesheet version='1.0'