Книга: XSLT
Образцы шага, часть 3: предикаты
Образцы шага, часть 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>
Этот образец выбирает любой элемент с дочерним элементом <NAME>
:
<xsl:template match="*[NAME]">
.
.
.
</xsl:template>
Теперь я задал элементам <PLANET>
в planets.xml
новый атрибут, COLOR
, устанавливающий цвет планеты:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xml" href="planets.xsl"?>
<PLANETS>
<PLANET COLOR="RED">
<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>
<PLANET COLOR="WHITE">
<NAME>Venus</NAME>
<MASS UNITS="(Earth = 1)">.815</MASS>
<DAY UNITS="days">116.75</DAY>
<RADIUS UNITS="miles">3716</RADIUS>
<DENSITY UNITS="(Earth = 1)">.943</DENSITY>
<DISTANCE UNITS="million miles">66.8</DISTANCE><!--B перигелии-->
</PLANET>
<PLANET COLOR="BLUE">
<NAME>Earth</NAME>
<MASS UNITS="(Earth = 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>
</PLANETS>
Следующее выражение выбирает элементы <PLANET>
с атрибутом COLOR
:
<xsl:template match="PLANET[@COLOR]">
.
.
.
</xsl:template>
А что, если нам требуется выбрать планеты, у которых атрибут COLOR
имеет значение "BLUE
" (голубой)? Это можно сделать при помощи операции =, как показано в листинге 4.5.
Листинг 4.5. Применение операции =
<"xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="PLANETS">
<HTML>
<xsl:apply-templates/>
</HTML>
</xsl:template>
<xsl:template match="PLANET[@COLOR = 'BLUE']">
The <xsl:value-of select="NAME"/> is blue.
</xsl:template>
<xsl:template match="text()">
</xsl:template>
</xsl:stylesheet>
Таблица стилей из листинга 4.5 отбирает планеты с голубым цветом и убирает остальные, выключая правило по умолчанию для текстовых узлов. Результат следующий:
<HTML>
The Earth is blue.
</HTML>
- Выбор корневого узла
- Выбор элементов
- Выбор дочерних элементов
- Выбор потомков элемента
- Выбор атрибутов
- Формальное определение образцов выбора
- Образцы шага, часть 1: оси образца
- Образцы шага, часть 2: условия узла
- Образцы шага, часть 3: предикаты
- Создание предикатов
- Выбор по ID
- Выбор по ключу
- Применение операции Or
- Примеры образцов
- Предикаты: фрагменты результирующего дерева
- Глава 4 Головоломки, логика и образцы
- Другие предикаты сравнения
- Глава 33 Четыре маленьких шага к большим продажам на Amazon
- Предикаты: наборы узлов
- Предикаты
- Предикаты: логические значения
- ГЛАВА 21. Выражения и предикаты.
- Продажи по шагам
- Дополнительные материалы. Образцы резюме
- Приложение 2. Образцы планов
- ГЛАВА 6. ВСТРОЕННЫЕ ПРЕДИКАТЫ