Вход/Регистрация
Технология XSLT
вернуться

Валиков Алексей Н.

Шрифт:

В общем случае, во множество узлов не входят дети узлов, содержащихся в нем. В нашем примере узлы элементов

G
,
H
и
I
вошли в выбранное множество только потому, что они соответствовали пути выборки
/A/C//node
. Если бы путь выборки имел вид
/A/C/node
(то есть, выбрать всех детей узла
C
, содержащегося в узле
A
, находящемся в корне документа), результат (рис. 3.14) был бы иным.

Рис. 3.14. Другой путь выборки

Выбранное множество узлов имело бы вид (рис. 3.15):

Рис. 3.15. Выбранное множество

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

/A
(выбрать узел
A
, находящийся в корне документа) было бы множество, состоящее из единственного узла (рис. 3.16).

Рис. 3.16. Множество, состоящее из единственного узла

Несмотря на то, что множества узлов неупорядочены, во многих случаях обработка узлов множества производится в порядке просмотра документа. Некоторые элементы, обрабатывающие множества (такие, как

xsl:apply-templates
и
xsl:for-each
) позволяют предварительно выполнять их сортировку при помощи элемента
xsl:sort
.

Множества узлов можно сравнивать при помощи операторов "

=
" (равно) и "
!=
" (не равно). В отличие от равенства математических множеств, равенство множеств узлов
A
и
B
в XSLT означает то, что найдется узел
a
, принадлежащий множеству
A
и узел
b
, принадлежащий множеству
B
такие, что их строковые значения будут равны. Неравенство множеств означает наличие в них как минимум пары узлов с различными строковыми представлениями. Такие определения делают возможным при сравнении двух множеств одновременное выполнение равенства и неравенства.

Пример
Листинг 3.2. Входящий документ A

<numbers>

 <int>1</int>

 <byte>2</byte>

 <int>2</int>

 <byte>3</byte>

</numbers>

Листинг 3.3. Преобразование

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="text"/>

 <xsl:template match="numbers">

<xsl:value-of select="int = byte"/>

<xsl:text> and </xsl:text>

<xsl:value-of select="int != byte"/>

 </xsl:template>

</xsl:stylesheet>

Результатом этого преобразования будет строка:

true and true

Этот пример показывает, что множество дочерних элементов

int
элемента
numbers
одновременно считает как равным, так и неравным множеству дочерних элементов
byte
.

Приведем еще несколько примеров.

Листинг 3.4. Входящий документ B

<numbers>

 <int>1</int>

 <byte>2</byte>

 <int>3</int>

 <byte>4</byte>

</numbers>

Результат:

false and true

Листинг 3.5. Входящий документ C

<numbers>

 <int>1</int>

 <byte>1</byte>

 <int>1</int>

</numbers>

Результат:

true and false

С математической точки зрения операции сравнения множеств определены в XSLT, мягко говоря, странно. Например, единственный случай, когда для двух множеств не будет выполняться неравенство ("

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

XSLT определяет единственную операцию над множествами — операцию объединения "

|
". Выражение "
$A | $B
" возвратит множество узлов, присутствующих либо в
$A
, либо в
$B
, либо и там, и там.

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

count
, которая возвращает количество узлов множества. Представим, что множество
$node
содержит некоторый узел, и мы хотим проверить, входит ли он во множество
$nodeset
. Сделать это можно при помощи выражения

  • Читать дальше
  • 1
  • ...
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: