Чтение онлайн

ЖАНРЫ

Технология XSLT

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

Шрифт:

Мы упомянули, что значением параметра может быть дерево. Попробуем пояснить эту концепцию на примере генерации HTML-документа.

Итак, предположим, что мы генерируем выходящий документ следующим именованным шаблоном:

<xsl:template name="html">

 <xsl:param name="head">

<head>

<title>Title one</title>

</head>

 </xsl:param>

 <html>

<xsl:copy-of select="$head"/>

<body>

<xsl:text>content</xsl:text>

</body>

</html>

 </xsl:template>

Параметр

head
по умолчанию будет содержать дерево, состоящее из элемента
head
и его дочернего элемента
title
, который содержит текст "
Title one
". Результат выполнения вызова

<xsl:call-template name="html"/>

мы можем видеть на следующем листинге:

<html>

 <head>

<title>Title one</title>

 </head>

 <body>content</body>

</html>

Выделенный фрагмент относится к части дерева, которая была создана копированием значения параметра

head
.

Попробуем теперь передать в качестве параметра дерево, сгенерированное следующим шаблоном:

<xsl:template name="head">

 <head>

<title>Title two</title>

<style type="text/css">

H1 {border-width: 1; border: solid; text-align: center}

</style>

 </head>

</xsl:template>

Для того чтобы передать результат выполнения этого шаблона в виде значения параметра

head
именованному шаблону
head
, воспользуемся следующей конструкцией:

<xsl:call-template name="html">

 <xsl:with-param name="head">

<xsl:call-template name="head"/>

 </xsl:with-param>

</xsl:call-template>

Выходящий документ будет получен в виде:

<html>

 <head>

<title>Title two</title>

<style type="text/css">

H1 {border-width: 1; border: solid; text-align: center}

</style>

 </head>

 <body>content</body>

</html>

Выделенный фрагмент, как и в предыдущем случае, соответствует части документа, полученной при копировании значения параметра

head
.

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

Глава 6

XPath-выражения

Выражения для XML-документов

По

мере распространения XML-технологий и развития смежных с ними областей стали выделяться не только задачи, которые хорошо подходят для решения с помощью XML, но и задачи, которые нужно решать при программировании самих XML-приложений. Одной из таких задач является обращение к определенным частям XML-документа. Например, если нам нужно получить из документа, скажем, цену продукта, которая находится в атрибуте
value
элемента
price
, принадлежащему элементу
product
, сделать это при помощи стандартных SAX- или DOM-интерфейсов было бы, мягко говоря, не очень удобно. И это еще простой пример. Бывают, действительно, сложные случаи, когда нужно выбрать узел определенного типа, который может находиться в нескольких местах в документе, да еще и должен обладать заданными свойствами.

Для выполнения часто встречающихся задач такого рода был создан язык XPath, название которого расшифровывается, как XML Path — язык XML- путей. Главной задачей этого языка является адресация, или, по-другому, определение местоположения частей XML-документа. На практике это означает выбор в документе множества узлов, которые соответствуют определенным условиям расположения.

Помимо главной задачи, в XPath имеются также дополнительные функции для работы со строками, числами, булевыми значениями и множествами узлов. Поэтому на самом деле XPath — это много больше, чем просто язык адресации. XPath-выражения, являющиеся самой общей конструкцией языка, могут возвращать значения любого из основных типов (кроме результирующего фрагмента дерева — этот тип может быть использован только в XSLT).

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

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

<xsl:value-of select="page/number"/>

для того, чтобы вывести номер страницы, указанный в элементе

number
, который находится в элементе
page
, мы не задумываемся о том, что
page/number
— это на самом деле XPath-выражение, точнее, путь выборки.

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

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

XP
, например:

[ХР1] LocationPath ::= RelativeLocationPath

| AbsoluteLocationPath

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

NCName
,
QName
и
S
, которые мы уже рассматривали ранее.
NCName
и
QName
относятся к расширенным именам, a
S
обозначает пробельное пространство.

Поделиться с друзьями: