Шаги расположения XPath, часть 1: оси

В пути расположения ancestor::NAME, адресующем элемент <NAME>, который является предком контекстного узла, ancestor выступает осью. XPath поддерживает много различных осей, ниже приведен полный список:

• ось ancestor содержит предков (ancestor) контекстного узла, то есть родителей контекстного узла, родителей этих родителей и т.д., вплоть до корневого узла (включая его);

• ось ancestor-or-self содержит контекстный узел и его предков;

• ось attribute содержит атрибуты контекстного узла;

• ось child содержит детей контекстного узла;

• ось descendant содержит потомков (descendant) контекстного узла, то есть его детей, детей этих детей и т.д.;

• ось descendant-or-self содержит контекстный узел и его потомков;

• ось following содержит все узлы в том же документе, такие же, как контекстный узел, встретившиеся после контекстного узла;

• ось following-sibling содержит всех последующих братьев контекстного узла. «Брат» — узел, расположенный на том же уровне, что и контекстный узел;

• ось namespace содержит узлы пространств имен контекстного узла;

• ось parent содержит родителя контекстного узла;

• ось preceding содержит все узлы до контекстного узла;

• ось preceding-sibling содержит всех предшествующих «братьев» контекстного узла;

• ось self содержит контекстный узел.

В следующем примере шаблона я воспользовался осью descendant для выбора потомков контекстного узла, куда входят дочерние узлы, узлы-внуки, узлы-правнуки и т.д.:

<xsl:template match='PLANET'>

 <DATA>

  <NAME>

   <xsl:value-of select='descendant::NAME'/>

  </NAME>

  <MASS>

   <xsl:value-of select='descendant::MASS'/>

  </MASS>

  <DAY>

   <xsl:value-of select='descendant::DAY'/>

  </DAY>

 </DATA>

</xsl:template>

В этой главе мы рассмотрим все перечисленные оси. В данном примере осью является descendant, а имена элементов NAME, MASS и DAY — это условия узлов.

Шаги расположения XPath, часть 2: условия узлов

При создании образцов в качестве условий узлов (node test) можно использовать имена узлов или символ подстановки * для выбора любого узла элемента. Например, выражение child::*/child::NAME выбирает все элементы <NAME>, являющиеся правнуками контекстного узла. В XPath кроме имен и символа подстановки можно также применять, как и в образцах выбора, следующие условия узлов:

• условие узла comment() выбирает узлы комментария;

• условие узла node() выбирает узел любого типа;

• условие узла processing-instruction() выбирает узел инструкции обработки. В скобках можно указать название выбираемой инструкции обработки;

• условие узла text() выбирает текстовый узел

Например, в листинге 7.2 таблица стилей находит в документе все комментарии при помощи условия узла comment() и создает для каждого комментария новый, <!--Warning:comment found!--> (Внимание! Найден комментарий!).

Листинг 7.2. Выбор комментариев

<?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='/'>

  <xsl:for-each select='descendant::comment()'>

   <xsl:comment>Warning: comment found!</xsl:comment>

  </xsl:for-each>

 </xsl:template>

</xsl:stylesheet>

При применении этой таблицы стилей к planets.xml получается следующий документ:

<?xml version='1.0' encoding='UTF-8'?>

<!--Warning: comment found!-->

<!--Warning: comment found!-->

<!--Warning: comment found!-->

Шаги расположения XPath, часть 3: предикаты

Предикат в шаге расположения XPath сам содержит заключенное в скобки выражение XPath, которое вычисляется в истину или ложь. Когда результатом вычисления выражения является строка, XPath считает ее истиной, если строка не пуста. Когда результат — набор узлов, XPath считает его истиной, если он не пуст. Когда результат — число, то общий результат будет считаться истиной, если это число совпадает с контекстной позицией — например, PLANET[3] будет истиной тогда и только тогда, когда истиной будет PLANET[position()=3].

Предикаты содержат выражения XPath наподобие тех, которые встречались нам на протяжении этой главы: редко когда выражение возвращает набор узлов, главным образом возвращаются строки, числа или логические значения. Например, путь расположения preceding-sibling::MASS[position()*4] выбирает четыре предыдущих элемента-брата <MASS> для контекстного узла.

Применение осей XPath

К этому моменту мы рассмотрели три части шагов расположения — ось, условие узла и предикат. Вы должны быть знакомы с этими элементами по проделанной нами работе с образцами выбора, но обратите

Вы читаете XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату