В этой главе мы рассмотрим все перечисленные оси. В данном примере
осью является
descendant
, а имена элементов
NAME
,
MASS
и
DAY
— это условия узлов.
Шаги расположения XPath, часть 2: условия узлов
При создании образцов в качестве условий узлов (node test) можно использовать имена узлов или символ подстановки * для выбора любого узла элемента. Например, выражение
child::*/child::NAME
выбирает все элементы
<NAME>
, являющиеся правнуками контекстного узла. В XPath кроме имен и символа подстановки можно также применять, как и в образцах выбора, следующие условия узлов:
• условие узла
comment
выбирает узлы комментария;
• условие узла
node
выбирает узел любого типа;
• условие узла
processing-instruction
выбирает узел инструкции обработки. В скобках можно указать название выбираемой инструкции обработки;
• условие узла
text
выбирает текстовый узел
Например, в листинге 7.2 таблица стилей находит в документе все комментарии при помощи условия узла
Предикат в шаге расположения XPath сам содержит заключенное в скобки выражение XPath, которое вычисляется в истину или ложь. Когда результатом вычисления выражения является строка, XPath считает ее истиной, если строка не пуста. Когда результат — набор узлов, XPath считает его истиной, если он не пуст. Когда результат — число, то общий результат будет считаться истиной, если это число совпадает с контекстной позицией — например,
PLANET[3]
будет истиной тогда и только тогда, когда истиной будет
PLANET[position=3]
.
Предикаты содержат выражения XPath наподобие тех, которые встречались нам на протяжении этой
главы: редко когда выражение возвращает набор узлов, главным образом возвращаются строки, числа или логические значения. Например, путь расположения
preceding-sibling::MASS[position*4]
выбирает четыре предыдущих элемента-брата
<MASS>
для контекстного узла.
Применение осей XPath
К этому моменту мы рассмотрели три части шагов расположения — ось, условие узла и предикат. Вы должны быть знакомы с этими элементами по проделанной нами работе с образцами выбора, но обратите внимание на ось в предыдущем примере —
preceding-sibling
. До сих пор мы видели только оси, выбиравшие образцы XSLT — оси
child
и
attribute
; теперь же мы рассмотрим новые оси, возможные в полных выражениях XPath, и начнем с оси
ancestor
.
Применение оси ancestor
Ось
ancestor
(предок) содержит всех предков контекстного узла, включая родителей, дедушек, прадедушек и т.д. Эта ось всегда содержит корневой узел — если только контекстным узлом не является сам корневой узел.
Взгляните на листинг 7.3, в котором при помощи оси
ancestor
осуществляется поиск имен (хранимых в элементе
<NAME>
) всех предков элементов
<MASS>
.
Листинг 7.3. Применение оси ancestor
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="MASS">
<xsl:for-each select="ancestor::*">
<xsl:value-of select="./NAME"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="PLANET">
<xsl:apply-templates select="MASS"/>
</xsl:template>
</xsl:stylesheet>
Вот результат применения этой таблицы стилей к
planets.xml
:
<?xml version="1.0" encoding="utf-8"?>
Mercury
Venus
Earth
Применение оси ancestor-or-self
Ось
ancestor-or-self
содержит всех предков контекстного узла, а также сам контекстный узел. Это означает, помимо прочего, что такая ось всегда содержит корневой узел.