На этом мы заканчиваем обсуждение возможных условий узлов в образцах шага. Третья и последняя часть образцов шага — предикаты
Образцы шага, часть 3: предикаты
Предикаты, третья часть образцов шага, содержат выражения XPath. Предикат можно заключить в операцию [] и проверить, верно ли заданное условие.
Например, можно проверить:
• значение атрибута в заданной строке;
• значение элемента;
• содержит ли элемент определенного ребенка, атрибут или другой элемент;
• позицию узла в дереве узлов.
Подробнее выражения XPath обсуждаются в главе 7, но здесь будет представлено введение в тему, так как эти
выражения можно применять в предикатах образцов.
Выражения XPath более сложны, чем образцы выбора. Если при их создании у вас возникнут затруднения, вам может помочь удобная программа-пример ApplyXPath.java из пакета Xalan, при помощи которой можно применить к документу выражение XPath и посмотреть на результаты. Например, если применить выражение XPath "
PLANET/NAME
" к
planets.xml
, будут отображены значения всех элементов
<NAME>
, дочерних по отношению к элементам
<PLANET>
(открывающий и закрывающий теги
<output>
добавляются программой ApplyXPath):
C:\>java ApplyXPath planets.xml PLANET/NAME
<output>
<NAME>Mercury</NAME>
<NAME>Venus</NAME>
<NAME>Earth</NAME>
</output>
Если предикат имеет числовое значение, последнее представляет условие позиции (position test). Например, NAME[1] выбирает первого ребенка
<NAME>
контекстного узла. Условия позиции W3C, а также условия позиции в Xalan, Oracle, XT, Saxon и MSXML3 (XML процессор от Microsoft, подразумевающий использование JavaScript, с которым вы встречались в главе 1 и еще встретитесь в главе 10, «Работа с API процессоров XSLT») основаны на 1, поэтому первый ребенок — это ребенок 1. Условия позиции в XML-документах, которые используют таблицы стилей XSL и загружаются в текущую версию Internet Explorer (версию 5.5, на смену которой приходит 6.0), основаны на 0 (и в предикатах можно использовать только очень сокращенную форму выражений XPath) — и, следовательно, так же считается в большей части документации по XSL на web-узле Microsoft. В другом случае значением предиката должна быть ложь или истина, что называется логическим условием (Boolean test). Например, предикат
[@UNITS="million miles"]
выбирает элементы, у которых имеются атрибуты
UNITS
со значением "
million miles
".
Предикаты являются полными выражениями XPath, хотя на предикаты, используемые в образцах, накладывается два ограничения:
• когда образец используется в атрибуте
match
, предикат не должен содержать никаких ссылок на переменные XSL (которые обсуждаются в главе 9). Это ограничение не применяется к предикатам, используемым в элементах
<xsl:number>
;
• образцы не могут использовать в предикатах функцию XPath
current
, возвращающую текущий узел. Ее применение ограничено, поэтому обработка зависит от реализации и не зависит от текущего состояния обработки.
В следующем примере образец выбирает элементы
<PLANET>
с дочерними элементами
<NAME>
:
<xsl:template match="PLANET[NAME]">
.
.
.
</xsl:template>
Этот
образец выбирает любой элемент с дочерним элементом