Spec-Zone .ru
спецификации, руководства, описания, API
След: API Java для XML, Обрабатывающего (JAXP)
Урок: Преобразования Расширяемого языка таблиц стилей
Как XPath Работает
Домашняя страница > API Java для XML, Обрабатывающего (JAXP) > Преобразования Расширяемого языка таблиц стилей

Как XPath Работает

Спецификация XPath является основой для множества спецификаций, включая XSLT и соединение/адресацию спецификаций, таких как XPointer. Таким образом, понимание XPath является основным принципом к большому усовершенствованному использованию XML. Этот раздел обеспечивает введение в XPath в контексте XSLT.

Выражения XPath

Вообще, выражение XPath определяет образец, который выбирает ряд узлов XML. Шаблоны XSLT тогда используют те образцы, применяя преобразования. (XPointer, с другой стороны, добавляет механизмы для того, чтобы определить точку или диапазон так, чтобы выражения XPath могли использоваться для того, чтобы адресоваться).

Узлы в выражении XPath обращаются к больше чем только элементам. Они также ссылаются на текст и атрибуты, между прочим. Фактически, спецификация XPath определяет абстрактную модель документа, которая определяет семь видов узлов:

Корневой элемент данных XML моделируется узлом элемента. Корневой узел XPath содержит корневой элемент документа так же как другую информацию, касающуюся документа.

Модель данных XSLT/XPath

Как Объектная модель документа (ДОМ), модель данных XSLT/XPath состоит из дерева, содержащего множество узлов. Под любым данным узлом элемента есть текстовые узлы, приписывают узлы, узлы элемента, узлы комментария, и узлы инструкции обработки.

В этой абстрактной модели исчезают синтаксические различия, и Вас оставляют с нормализованным представлением данных. В текстовом узле, например, это не имеет никакого значения, был ли текст определен в разделе CDATA или включало ли это ссылки на сущность. Текстовый узел будет состоять из нормализованных данных, поскольку это существует после того, как весь парсинг полон. Таким образом, текст будет содержать символ <, использовалась ли ссылка на сущность, такая как < или раздел CDATA, чтобы включать это. (Точно так же текст будет содержать символ &, был ли он предоставлен, используя &, или это было в разделе CDATA).

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

Шаблоны и Контексты

Шаблон XSLT является рядом инструкций форматирования, которые применяются к узлам, выбранным выражением XPath. В таблице стилей выглядел бы примерно так шаблон XSLT:

<xsl:template match="//LIST">
    ...
</xsl:template>

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

Набор узлов, выбранных таким выражением, определяет контекст, в котором оцениваются другие выражения в шаблоне. Тот контекст можно рассмотреть как целый набор - например, определяя число узлов, которые это содержит.

Контекст можно также рассмотреть как единственный элемент набора, поскольку каждый элемент обрабатывается один за другим. Например, в LIST - обрабатывающий шаблон, выражение @type обращается к атрибуту типа текущего узла LIST. (Точно так же выражение @* обращается ко всем атрибутам для текущего элемента СПИСКА).

Основная Адресация XPath

XML-документ является (иерархическим) набором с древовидной структурой узлов. Как с иерархической структурой каталога, полезно определить путь, который указывает на определенный узел в иерархии (отсюда имя спецификации: XPath). Фактически, большая часть нотации путей к каталогам переносится неповрежденная:

Например, в Расширяемом HTML (XHTML) документ (XML-документ, который похож на HTML, но хорошо формируется согласно правилам XML), путь, /h1/h2/ указал бы на элемент h2 под h1. (Вспомните, что в XML, имена элементов являются чувствительными к регистру, таким образом, этот вид спецификации работает намного лучше в XHTML, чем это было бы в простом HTML, потому что HTML является нечувствительным к регистру).

В спецификации сопоставления с образцом, такой как XPath, спецификация /h1/h2 выбирает все элементы h2, которые лежат под элементом h1. Чтобы выбрать определенный элемент h2, Вы используете квадратные скобки [] для того, чтобы индексировать (как используемые для массивов). Путь /h1[4]/h2[5] поэтому выбрал бы пятый элемент h2 под четвертым элементом h1.


Отметьте - В XHTML, все имена элементов находятся в нижнем регистре. Это - довольно общее соглашение для XML-документов. Однако, имена верхнего регистра легче считать в учебном руководстве как этот. Так для остатка от урока XSLT, все имена элементов XML будут в верхнем регистре. (Названия атрибута, с другой стороны, останутся в нижнем регистре).


Имя, определенное в выражении XPath, обращается к элементу. Например, h1 в /h1/h2 обращается к элементу h1. Чтобы обратиться к атрибуту, Вы снабжаете префиксом название атрибута знак @. Например, @type обращается к атрибуту типа элемента. Предположение, что у Вас есть XML-документ с элементами СПИСКА, например, выражение LIST/@type, выбирает атрибут типа элемента LIST.


Отметьте - поскольку выражение не начинается с /, ссылка определяет узел списка относительно текущего контекста - безотносительно позиции в документе, который, оказывается.


Основные Выражения XPath

Полный спектр выражений XPath использует в своих интересах подстановочные знаки, операторы, и функции, которые определяет XPath. Вы узнаете больше о тех коротко. Здесь, мы смотрим на несколько наиболее распространенных выражений XPath просто, чтобы представить их.

@type="unordered" выражения определяет атрибут под названием type, значением которого является unordered. Выражение, такое как LIST/@type определяет атрибут типа элемента LIST.

Можно объединить те две нотации, чтобы получить что-то интересное. В XPath нотация квадратной скобки ([]), обычно связываемый с индексацией, расширяется, чтобы определить критерии отбора. Так выражение LIST[@type="unordered"] выбирает все элементы LIST, значение типа которых неупорядочивается.

Подобные выражения существуют для элементов. У каждого элемента есть связанное строковое значение, которое формируется, связывая все текстовые сегменты, которые лежат под элементом. (Более подробное объяснение того, как тот процесс работает, представляется в Строковом значении Элемента).

Предположите Вас модель, что продолжается в Вашей организации, используя структуру XML, которая состоит из элементов PROJECT и элементов ACTIVITY, у которых есть текстовая строка с названием проекта, многократные элементы PERSON, чтобы перечислить включенных людей и, дополнительно, элемент STATUS, который записывает состояние проекта. Вот другие примеры, которые используют расширенную нотацию квадратной скобки:

Объединение Индексирует Адреса

Спецификация XPath определяет довольно много механизмов адресации, и они могут быть объединены многими различными способами. В результате XPath поставляет много выразительного питания для относительно простой спецификации. Этот раздел иллюстрирует другие интересные комбинации:


Отметьте - еще Много комбинаций операций взятия адреса перечисляются в разделе 2.5 из спецификации XPath. Это - возможно самый полезный раздел спецификации для того, чтобы определить XSLT, преобразовывают.


Подстановочные знаки

По определению неполное выражение XPath выбирает ряд узлов XML, который соответствует тот указанный образец. Например, /HEAD соответствует всему верхнему уровню записи HEAD, тогда как /HEAD[1] соответствует только первое.  Таблица 4-1 перечисляет подстановочные знаки, которые могут использоваться в выражениях XPath, чтобы расширить контекст сопоставления с образцом.

 Таблица 4-1 Подстановочные знаки XPath

Подстановочный знак

Значение

*

Соответствия любой узел элемента (не атрибуты или текст).

node()

Соответствия любой узел любого вида: узел элемента, текстовый узел, приписывает узел, обрабатывая узел инструкции, узел пространства имен, или узел комментария.

@*

Соответствия любой узел атрибута.

В примере базы данных проекта /*/PERSON[.="Fred"] соответствует любой PROJECT или элемент ACTIVITY, который называет Фреда.

Адресация расширенного пути

До сих пор все образцы, которые Вы видели, определили точное число уровней в иерархии. Например, /HEAD определяет любой элемент HEAD на первом уровне в иерархии, тогда как /*/* определяет любой элемент на втором уровне в иерархии. Чтобы определить неопределенный уровень в иерархии, используйте двойную наклонную черту вправо (//). Например, выражение XPath, //PARA выбирает все элементы абзаца в документе, везде, где они могут быть найдены.

Образец // может также использоваться в пути. Так выражение /HEAD/LIST//PARA указывает на все элементы абзаца в поддереве, которое начинается с/HEAD/LIST.

Типы данных XPath и Операторы

Выражения XPath приводят к любому ряду узлов, строки, Булево (истинное/ложное значение), или число.  Таблица 4-2 перечисляет операторы, которые могут использоваться в выражении Xpath:

 Таблица 4-2 Операторы XPath

Оператор

Значение

|

Альтернатива. Например, PARA|LIST выбирает весь PARA и элементы LIST.

or, and

Возвращается или/и двух Булевых значений.

=, !=

Равный или не равный, для Булевских переменных, строк, и чисел.

<, >, <=, >=

Меньше чем, больше чем, меньше чем или равный, больше чем или равный, для чисел.

+, -, *, div, mod

Добавьте, вычтите, умножьтесь, дележ с плавающей точкой, и модуль (остаток) операции (например, 6 модников 4 = 2).

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


Отметьте - приоритет Оператора является термином, который отвечает на вопрос, "Если Вы определяете + b * c, который означает (a+b) * c или + (b*c)?" (Приоритет оператора является примерно тем же самым как тем показанным в таблице).


Строковое значение Элемента

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

<PARA>This paragraph contains a <b>bold</b> word</PARA>

Строковое значение элемента <PARA> является Этим абзацем, содержит полужирное слово. В частности отметьте, что <B> является дочерним элементом <PARA> и что текст bold является дочерним элементом <B>.

Дело в том, что весь текст во всех дочерних элементах узла участвует в связи, чтобы сформировать строковое значение.

Кроме того, это стоит понять, что текст в модели абстрактных данных, определенной XPath, полностью нормализуется. Так, содержит ли структура XML ссылку на сущность &lt; или < в разделе CDATA, строковое значение элемента будет содержать символ <. Поэтому, генерируя HTML или XML с таблицей стилей XSLT, следует преобразовать возникновения < к &lt; или включить их в раздел CDATA. Точно так же возникновения & должны быть преобразованы в &amp;.

Функции XPath

Этот раздел заканчивается кратким обзором функций XPath. Можно использовать функции XPath, чтобы выбрать набор узлов таким же образом, что Вы использовали бы спецификацию элемента, такую как те, Вы уже видели. Другие функции возвращают строку, число, или Булево значение. Например, выражение /PROJECT/text() получает строковое значение узлов PROJECT.

Много функций зависят от текущего контекста. В предыдущем примере контекст для каждого вызова функции text() является узлом PROJECT, который в настоящий момент выбирается.

Есть много функций XPath - слишком многие, чтобы описать подробно здесь. Этот раздел обеспечивает резюме, перечисляющее, который показывает доступные функции XPath, наряду со сводкой того, что они делают. Для получения дополнительной информации о функциях, см. раздел 4 из спецификации XPath.

Функции набора узлов

Много выражений XPath выбирают ряд узлов. В основном они возвращают набор узлов. Одна функция делает это, также. Функция id(...) возвращает узел с указанным ID. (У элементов есть ID только, когда у документа есть DTD, который определяет, у какого атрибута есть тип ID).

Позиционные Функции

Эти функции возвращают позиционально базируемые числовые значения.

Строковые функции

Эти функции работают на или строки возврата.


Отметьте - XPath определяет три способа получить текст элемента: text(), string(object), и строковое значение, подразумеваемое именем элемента в выражении как это: /PROJECT[PERSON="Fred"].


Булевы функции

Эти функции работают на или возвращают Булевы значения.

Числовые Функции

Эти функции работают на или возвращают числовые значения.

Функции преобразования

Эти функции преобразовывают один тип данных в другого.

Функции пространства имен

Эти функции, которым позволяют Вы определить характеристики пространства имен узла.

Сводка

Операторы XPath, функции, подстановочные знаки, и адресующие узел механизмы могут быть объединены в большом разнообразии путей. Введение, которое Вы имели до сих пор, должно давать Вам хорошее преимущество при определении образца, в котором Вы нуждаетесь для любой конкретной цели.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Представляя XSL, XSLT, и XPath
Следующая страница: Выписывание ДОМА как XML-файл