Алексей Валиков - Технология XSLT
- Название:Технология XSLT
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2002
- Город:Санкт-Петербург
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Валиков - Технология XSLT краткое содержание
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
Технология XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
namespace-uri="http://www.a.com"
local-name="a">
namespace-uri="http://www.b.com"
local-name="b">
namespace-uri=""
local-name="c"/>
Функция id
node-set id( object )
Мы уже встречались с функцией id
, когда говорили об уникальных атрибутах элементов и еще раз — когда разбирали паттерны. Функция id
позволяет обращаться к элементам по значениями их уникальных атрибутов.
Функция id
выполняется по-разному в зависимости от того, какой тип данных ей передается.
□ Если аргументом функции является строка, она рассматривается как набор идентификаторов, разделенных пробелами. В результирующее множество узлов войдут узлы тех элементов текущего документа, значения уникальных атрибутов которых входят в набор идентификаторов, определяемый строковым аргументом.
□ Если аргументом функции является множество узлов, результатом ее выполнения будет объединение результатов функции id
, примененной к строковому значению каждого из узлов множества.
□ Если аргументом функции является объект другого типа, аргумент вначале преобразуется в строку и функция id
выполняется как со строковым параметром.
Предположим, что мы используем XML для того, чтобы описать граф — множество вершин, соединенных дугами (рис. 6.11).

Рис. 6.11. Изображение графа, который мы будем описывать в XML
Каждой вершине будет соответствовать элемент vertex
. Для того чтобы описать все связи, мы дадим каждой вершине уникальное имя, которое будет записано в ее ID
-атрибуте name
. Имена вершин, с которыми она соединена, будут перечислены в атрибуте connects
типа IDREFS
.
Документ, описывающий этот граф, может выглядеть следующим образом.
Декларация типа документа вынесена во внешний файл gemini.dtd
.
name ID #REQUIRED
connects IDREFS #REQUIRED>
При обработке этого документа функция id
будет очень полезна для выбора элементов соединенных вершин. Действительно, функция id
, которой будет передано значение атрибута connects
(в котором через пробелы перечислены вершины, смежные данной), возвратит множество, состоящее из элементов с перечисленными уникальными идентификаторами. Так, например, функция id('tau upsilon')
возвратит множество, состоящее из двух элементов с атрибутами name, равными tau
и upsilon
соответственно.
Более того, функция id
может быть вычислена и от множества узлов. В этом случае ее значением будет объединение множеств, полученных в результате выполнения функции от строкового значения каждого узла переданного множества. Например, id(id('tau upsilon')/@connects)
возвратит множество, состоящее из вершин с именами alpha
, beta
, delta
, epsilon
, theta
, iota
и kappa
— множество вершин, смежных с вершинами tau и upsilon.
Приведем пример преобразования, которое в каждый элемент vertex
добавляет комментарий, в котором перечислены имена вершин, достижимых из текущей, не более чем за два шага.
Для того чтобы найти множество вершин, достижимых за один шаг (иначе говоря, смежных), мы воспользуемся выражением вида id(@connects)
, для выборки множества вершин, достижимых из текущей за два шага — выражением id(id(@connects)/@connects)
. Таким образом, множество вершин, достижимых не более чем за два шага, будет вычисляться как
id(@connects)|id(id(@connects)/@connects)
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Базовые продукции XPath
В этом разделе мы приведем базовые синтаксические правила языка XPath. Со многими из них мы уже встречались в правилах более высокого уровня, некоторые определены в спецификации для того, чтобы облегчить реализацию лексического разбора XPath-выражений в различных процессорах.
Литералы — это строковые значения, заключенные в одинарные или двойные кавычки. В литералах нельзя использовать символ кавычек, в которые они заключены. Кроме этого, поскольку XPath-выражения чаще всего используются в атрибутах элементов, в них нельзя использовать символы " <
" и " &
" — они должны заменяться на сущности. Литералам соответствует продукция Literal
, определяемая в виде:
[XP29] Literal ::= '"' [^"]* '"' | "'" [^']* "'"
XPath использует десятичную систему счисления. Наборы цифр, соответствующие правилу Digits
, могут состоять из цифр от 0
до 9
:
[XP31] Digits ::= [0-9]+
Число в XPath состоит из последовательности цифр, которые могут быть разделены точкой, причем точка может стоять как в начале числа ( .5
), так и в конце ( 5.
). Числу соответствует EBNF-правило Number
:
[XP30] Number ::= Digits ('.' Digits?)? | '.' Digits
Оператору умножения соответствует символ " *
" и синтаксическое правило MultiplyOperator
:
[XP34] MultiplyOperator ::= '*'
Именам переменных, которые используются в XPath, предшествует символ " $
". Сами же имена должны удовлетворять продукции QName
, которую мы рассматривали в разделе "Расширенные имена" .
[XP36] VariableReference ::= '$' QName
Продукция NodeType
, использованная в тесте узла ( см. раздел "Тесты узлов" данной главы, продукция [XP7]
), определяет типы узлов, которые можно проверить при тесте — comment
(комментарий), text
(текстовый узел), processing-instruction
(узел инструкции по обработке) и node
(узел любого типа). NodeType
записывается следующим образом:
[XP38] NodeType ::= 'comment'
| 'text'
| 'processing-instruction'
| 'node'
Другая конструкция, NameTest
, которая также используется в тесте узла, проверяет узлы базового типа оси на соответствие определенному имени. EBNF-правило NameTest
имеет следующий синтаксис:
[ХР37] NameTest ::= '*' | NCName ':' '*' | QName
Имя функции в XPath может быть любым корректным XML-именем за исключением тех имен, которые используются для обозначения типов узлов. Правило FunctionName
имеет вид:
[XP35] FunctionName ::= QName - NodeType
В целях удобочитаемости, в выражениях можно использовать пробельное пространство. Ему соответствует EBNF-правило ExprWhiteSpace
:
[XP39] ExprWhitespace ::= S
Разбор XPath-выражений
Хотя синтаксис языка XPath укладывается в тридцать с небольшим синтаксических правил, реализация интерпретатора XPath-выражений может быть довольно непростой задачей. Для того чтобы хоть как-то упростить ее, в XPath определяются так называемые токены выражения (англ. expression token). Токены — это единицы, из которых состоит выражение. Будучи сами очень простыми, они выстраиваются в более сложные конструкции, образуя, в итоге, выражения.
Читать дальшеИнтервал:
Закладка: