". Как правило, нет особых причин применять условие узла
text
. В XSLT существует правило по умолчанию, в соответствии с которым текст текстового узла включается в выходной документ, если этот узел не выбирается какими-либо другими правилами. Если нужно сделать это правило по умолчанию явным, можно поступить, например, так:
<xsl:template match="text">
<xsl:value-of select="."/>
</xsl:template>
Можно
перекрыть это правило, не отправляя текст из текстовых узлов в выходной документ, — в том числе так:
<xsl:template match="text">
</xsl:template>
Потребность в применении условия текстового узла возникает, например, когда нужно выбрать узлы с определенным текстом. Предикат "
NAME[text='Venus']
" выбирает элементы
<NAME>
, в которых содержится имя "
Venus
". (Будьте внимательны с вложением кавычек, чтобы процессор XSLT не ошибся, — например, такой предикат не работает: "
NAME[text="Venus"]
".) Еще одна причина для использования условия текстового узла появляется, когда требуется применить к текстовым узлам некоторое условие при помощи строковых функций XPath (которые будут рассмотрены позже в этой главе). Например, текстовый узел "
Earth
" в
<NAME>Earth</NAME>
выбирается образцом "
text[starts-with(.,'Е')]
".
КАК УБРАТЬ КОММЕНТАРИИ
Ранее мы видели, что образец "@*|node" (в котором используется операция OR, обсуждаемая позже) выбирает из файла planets.xml все, включая комментарии. Если вы хотите убрать комментарии, воспользуйтесь образцом "@*|*|text", который сохраняет только элементы, атрибуты и текстовые узлы.
Выбор инструкций обработки
Для выбора инструкций обработки используйте образец
processing-instruction
:
<xsl:template match="/processing-instruction">
<I>
Found a processing instruction.
</I>
</xsl:template>
Можно также указать, какую именно инструкцию обработки вы хотите выбрать, задав имя инструкции (исключая
<?
и
?>
), — как в следующем примере, в котором выбирается инструкция обработки
РАЗЛИЧИЕ МЕЖДУ КОРНЕВЫМИ УЗЛАМИ И КОРНЕВЫМИ ЭЛЕМЕНТАМИ
Одна из основных причин различия корневого узла в самом начале документа и корневого элемента заключается в том, что при этом у вас есть доступ к инструкциям обработки и другим узлам в прологе документа.
На этом мы заканчиваем обсуждение возможных условий узлов в образцах шага. Третья и последняя часть образцов шага — предикаты
Образцы шага, часть 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>
Этот образец выбирает любой элемент с дочерним элементом