Результирующий фрагмент дерева (result tree fragment)
Результирующий фрагмент дерева (result tree fragment)
Четыре типа данных, описанных выше, заимствованы языком XSLT из XPath. Вместе с тем, XSLT имеет и свой собственный тип данных, называемый result tree fragment (результирующий фрагмент дерева).
Для того чтобы понять этот тип данных, обратимся к примеру шаблона:
<xsl:template match="href">
<B>You may visit the <A HREF="{location}">following link</A>.</B>
</xsl:template>
Если мы применим это правило к части документа
<href>
<location>http://www.xsltdev.ru</location>
</href>
то получим следующий результат:
<B>You may visit the <A HREF="http://www.xsltdev.ru">following link</A>.</B>
В терминах деревьев выполнение этого шаблона показано на рис. 3.17.
Рис. 3.17. Часть дерева входящего документа и часть дерева сгенерированного документа
Поскольку XSLT оперирует документами, представленными в виде деревьев, уместнее будет сказать, что на самом деле шаблоны обрабатывают фрагменты входящего дерева и создают фрагменты исходящего. Последним и соответствует тип данных, который в XSLT называют результирующим фрагментом дерева. Попросту говоря, все, что создается шаблонами во время выполнения преобразования, является результирующими фрагментами и, в конечном итоге, дерево выходящего документа есть композиция этих фрагментов.
Структурно результирующий фрагмент дерева тоже является деревом — это просто отрезанная ветка. Шаблоны генерируют ветки, используя собственные инструкции, а также результаты выполнения шаблонов, которые они вызывают и в итоге множество веток срастается в одно большое дерево, которое и является целью преобразования.
Между тем, результирующие фрагменты деревьев могут и не попасть в само результирующее дерево, то есть совершенно не факт, что они всегда будут его частями. Например, результирующий фрагмент дерева может быть присвоен переменной как начальное значение. Это предоставляет следующие, очень интересные возможности.
? Переменная может содержать дерево, являющееся результатом обработки документа. К сожалению, в чистом XSLT нельзя повторно обрабатывать части документов, однако, это реализуется при помощи механизма расширений.
? Дерево может быть определено один раз в виде значения переменной и использовано несколько раз в выходящем документе.
Пример
Листинг 3.10. Входящий документ
<href>
<location>http://www.xsltdev.ru</location>
</href>
Листинг 3.11. Преобразование
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="href">
<body>
<xsl:apply-templates select="href"/>
</body>
</xsl:variable>
<xsl:template match="href">
<B>You may visit the <A HREF="{location}">following link</A>.</B>
</xsl:template>
<xsl:template match="/">
<result>
<xsl:text>
Result as string:
</xsl:text>
<xsl:value-of select="$href"/>
<xsl:text>
Result as tree:
</xsl:text>
<xsl:copy-of select="$href"/>
<xsl:text>
</xsl:text>
</result>
</xsl:template>
</xsl:stylesheet>
Листинг 3.12. Выходящий документ
<result>
Result as string:
You may visit the following link.
Result as tree:
<body><B>You may visit the <A HREF="http://www.xsltdev.ru">following
link</A>.</B>
</body>
</result>
Это преобразование легко понять, если обратиться к рис. 3.18.
Рис. 3.18. Генерация выходящего дерева с использованием переменных
Переменной href присваивается дерево, содержащее результат обработки элемента href, находящегося в корне входящего документа. Затем переменная href дважды используется в результирующем документе: один раз как строка, принадлежащая текстовому узлу, и один раз как результирующий фрагмент дерева.
Дерево может быть преобразовано в булевое значение, число или строку. Некоторые процессоры позволяют также преобразовывать дерево во множество узлов, которое содержит единственный элемент — корневой узел этого дерева. Такие возможности бывают весьма полезными, но не являются, к сожалению, стандартными в текущей версии языка.
При преобразовании результирующего фрагмента дерева в булевое значение результатом всегда будет true, поскольку дерево никогда не бывает "пустым" — в нем всегда присутствует корневой узел.
При преобразовании дерева в строку результатом является конкатенация (строковое сложение) всех текстовых узлов дерева в порядке просмотра.
Пример
Результирующий фрагмент дерева
<body>
<B>You may visit the <A HREF="http://www.xsltdev.ru">following
link</A>.</B>
</body>
приводится к строке
The result is: You may visit the following link.
При приведении дерева к числу, оно сначала преобразовывается в строку, а затем в число. Это означает, что деревья, в принципе, можно использовать в арифметических операциях, несмотря на то, что они для этого не предназначены.
Пример
Листинг 3.13. Входящий документ:
<numbers>
<integer>1</integer>
<real>1</real>
<integer>2</integer>
<real>2</real>
<integer>3</integer>
<real>3.5</real>
</numbers>
Листинг 3.14. Преобразование:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="integers">
<integers><xsl:copy-of select="/numbers/integer"/></integers>
</xsl:variable>
<xsl:variable name="reals">
<reals><xsl:copy-of select="/numbers/real"/></reals>
</xsl:variable>
<xsl:template match="/">
<result>
<xsl:text>
 Integers:
</xsl:text>
<xsl:value-of select="$integers"/>
<xsl:text>
Reals:
</xsl:text>
<xsl:value-of select="$reals"/>
<xsl:text>
Reals minus integers:
</xsl:text>
<xsl:value-of select="$reals - $integers"/>
<xsl:text>
</xsl:text>
</result>
</xsl:template>
</xsl:stylesheet>
Листинг 3.15. Результат
<result>
Integers:
123
Reals:
123.5
Reals minus integers:
0.5
</result>
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
14.4.5. Обход дерева: twalk()
14.4.5. Обход дерева: twalk() Функция twalk() объявлена в <search.h> следующим образом:typedef enum { preorder, postorder, endorder, leaf } VISIT;void twalk(const void *root, void (*action)(const void *nodep, const VISIT which,const int depth));Первый параметр является корнем дерева (не указателем на корень). Второй является указателем на функцию
14.4.6. Удаление вершины дерева и удаление дерева: tdelete() и tdestroy()
14.4.6. Удаление вершины дерева и удаление дерева: tdelete() и tdestroy() Наконец, вы можете удалить элементы из дерева и, на системах GLIBC, удалить само дерево целиком:void *tdelete(const void *key, void **rootp,int (*compare)(const void*, const void*));/* Расширение GLIBC, в POSIX нет: */void tdestroy(void *root, void (*free_node)(void *nodep));Аргументы
6.3. Влияние семантики и DOM-дерева
6.3. Влияние семантики и DOM-дерева Давайте рассмотрим сейчас другой вопрос, а именно: как быстро браузер создает DOM-дерево в зависимости от наличия в нем элементов с id или class?Для этого мы подготовим 3 набора HTML-файлов. Первый будет содержать 10000 элементов, у которых только
Графики влияния DOM-дерева
Графики влияния DOM-дерева Ниже приведены разделенные графики по средневзвешенному (естественно, основную роль играет Internet Explorer, ибо сейчас им пользуются от 50% до 70% посетителей наших сайтов) времени создания документа (рис. 6.1) Рис. 6.1. Скорость создания документа,
9.3.1. Реализация двоичного дерева
9.3.1. Реализация двоичного дерева Ruby позволяет реализовать двоичное дерево разными способами. Например, хранить значения узлов можно в массиве. Но мы применим более традиционный подход, характерный для кодирования на С, только указатели заменим ссылками на объекты.Что
Создание бинарного дерева
Создание бинарного дерева Само по себе создание бинарного дерева тривиально. В простейшем случае корневой узел бинарного дерева определяет все бинарное дерево.varMyBinaryTree : PtBinTreeNode;Если MyBinaryTree равен nil, никакого бинарного дерева не существует, поэтому это значение служит
Удаление из сортирующего дерева
Удаление из сортирующего дерева Теперь, поскольку мы только что показали, что требуемый элемент расположен в позиции корневого узла, можно приступить к удалению наибольшего узла. Удаление корневого узла и передача этого элемента вызывающей процедуре - не самая лучшая
1.2.5. Диаграммы дерева узлов и FEO
1.2.5. Диаграммы дерева узлов и FEO Диаграмма дерева узлов показывает иерархию работ в модели и позволяет рассмотреть всю модель целиком, но не показывает взаимосвязи между работами (стрелки) (рис. 1.2.23). Процесс создания модели работ является итерационным, следовательно,
1.2.5. Диаграммы дерева узлов и FEO
1.2.5. Диаграммы дерева узлов и FEO Диаграмма дерева узлов показывает иерархию работ в модели и позволяет рассмотреть всю модель целиком, но не показывает взаимосвязи между работами (стрелки) (рис. 1.25). Процесс создания модели работ является итерационным, следовательно,
Узлы дерева XML-документа
Узлы дерева XML-документа Корневой узел Корневой узел XML-документа — это узел, который является корнем дерева документа. Не следует путать его с корневым элементом документа, поскольку помимо корневого элемента дочерними узлами корня также являются инструкции по
Отсутствие result tree fragment
Отсутствие result tree fragment Главное и наиболее существенное отличие XSLT 1.1 от XSLT 1.0 состоит в том, что тип данных, известный в XSLT 1.0 как result tree fragment (результирующий фрагмент дерева) в XSLT 1.1. отсутствует. Вместо него в версии 1.1 используется множество узлов, состоящее из
5.1.4. Фрагмент текста
5.1.4. Фрагмент текста Фрагмент текста— это выделенная часть текста. В отличие от MS Word выделение в редакторе Pages обозначается по умолчанию голубым цветом, а не черным. Замечание Цвет выделения назначается с помощью мини-утилиты Внешний вид (Appearance) в окне Системные настройки