Чтобы еще больше все усложнить, следует сказать, что выражения XPath можно использовать в специальной, необязательной части (и только в этой части) образцов выбора: в предикатах. Как мы увидим в этой главе, предикаты — это выражения XPath, которые вычисляются либо в значения «истина/ложь», либо в числа, заключаемые в квадратные скобки, [ и ]. Например, образец PLANET[NAME="Venus"]
выбирает дочерние узлы контекстного узла, у которых есть дочерние узлы с текстом «Venus». Выражения внутри [ и ] представляют собой настоящие выражения XPath с известными ограничениями, которые будут рассмотрены в этой главе.
Безусловно, для создания образцов выбора необходим опыт, поэтому в данной главе приводится много примеров.
MICROSOFT И НЕСТАНДАРТНЫЕ ОБРАЗЦЫ ВЫБОРА
Microsoft поддерживает образцы выбора в своем процессоре XML MSXML3, но есть еще кое-что, о чем вам следует знать: с образцами выбора Microsoft использует также весьма много нестандартного, не используемого W3C синтаксиса. В этой главе я собираюсь придерживаться официальной, W3C, версии, и если вам доведется читать документацию Microsoft об образцах выбора, имейте в виду, что многое из этой документации относится только к реализации Microsoft.
Как вы уже видели, выбрать корневой узел можно при помощи образца выбора «/», как, например:
Можно выбирать элементы, просто задавая их имена, как мы уже видели. Следующий шаблон выбирает элементы :
При доступе к дочернему узлу определенного узла для разделения имен элементов можно использовать операцию шага /. Пусть, например, требуется создать правило, которое должно применяться только к тем элементам , которые являются дочерними для элементов . Для этого можно задать выражение " PLANET/NAME
". Вот правило, окружающее текст таких элементов в элемент HTML <���Н3>
:
Можно также использовать символ * в качестве символа-подстановки, что соответствует любому элементу. (* может выбирать только элементы, однако образец @* выбирает любой атрибут.) Например, следующее правило применяется ко всем элементам , которые являются внуками элементов :
В предыдущем разделе при помощи выражения " PLANET/NAME
" я выбирал все элементы , являющиеся прямыми потомками элементов , а при помощи выражения " PLANET/*/NAME
" — все элементы , являющиеся внуками элементов . Есть, однако, более простой способ выполнить оба выбора — применить выражение " PLANET//NAME
", выбирающее все элементы , находящиеся внутри элементов , независимо от глубины вложенности (соответствующие элементы называются потомками элемента ). Иными словами, " PLANET//NAME
" выбирает " PLANET/NAME
", " PLANET/*/NAME
", " PLANET/*/*/NAME
" и т.д.:
Как было показано в главе 3, «Создание и применение шаблонов», можно выбирать атрибуты, если предварять их имена префиксом @. Вы уже работали с атрибутом UNITS
, который поддерживают большинство детей элементов :
Earth
1
1
2107
1
128.4
Чтобы извлечь единицы измерения и отобразить их вместе со значениями массы и т.п., можно выбрать атрибут UNITS
при помощи @UNITS
(листинг 4.1).
Листинг 4.1. Выбор атрибутов
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
.
.
.
.
.
.
|
|
</ТD> |
Теперь результирующая HTML-таблица включает не только значения, но и их единицы измерения:
The Planets Table
The Planets Table
.
.
.
.
.
.
|
Mercury |
.0553 (Earth = 1) |
1516 miles |
Venus |
.815 (Earth = 1) |
3716 miles |
Для выбора всех атрибутов элемента можно также использовать подстановку. Например, " PLANET/@*
" выбирает все атрибуты элементов .
Формальное определение образцов выбора
Определение образцов выбора приводится также в рекомендации XSLT W3C. Образцы выбора определяются в терминах выражений XPath следующим образом: «Синтаксис для образцов является подмножеством для выражений [XPath]. В частности, пути расположения, удовлетворяющие определенным ограничениям, могут использоваться как образцы. Выражение, в то же время являющееся образцом, всегда вычисляется в объект типа набора узлов. Узел удовлетворяет образцу, если узел является членом результата вычисления образца как выражения по отношению к возможному контексту; возможный контекст — это контекст, контекстный узел которого был выбран, или один из его предков».
Читать дальше