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

ЖАНРЫ

Технология XSLT

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

Шрифт:

Вызов document(node-set, node-set)

Если функции

document
передаются два множества узлов, то вычисление результата можно описать примерно следующим образом:

□ каждый из узлов первого аргумента преобразуется в строковый вид;

□ для каждого из полученных значений выполняется вызов типа

document(string, node-set)
;

□ результирующие множества объединяются.

Иными словами,

document(node-set, node-set)
работает через
document(string, node-set)
точно так же, как
document(node-set)
работает
через
document(string)
. Разница лишь в том, что в первом случае базовый URI будет изменен.

Другие дополнительные функции XSLT

Функция current

Выражение для этой функции имеет вид:

node-set current

Функция

current
возвращает множество, состоящее из текущего узла преобразования.

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

Представим себе, что нам нужно выбрать элементы

item
со значением атрибута
source
, равным значению этого атрибута текущего узла. Очевидно, путь выборки будет выглядеть как
item[предикат]
, где предикат определяет условие равенства атрибутов текущего и выбираемого. Но как записать это условие? Предикат будет вычисляться в контексте проверяемого элемента
item
, значит, все относительные пути выборки типа
@source
или
./@source
или
self::item/@source
будут отсчитываться именно от проверяемого элемента. В этом случае узел контекста и текущий узел преобразования — не одно и то же.

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

current
:

item[@source=current/@source]

Это выражение выберет все дочерние элементы

item
текущего узла, значение атрибута
source
которых будет таким же, как и у него.

Функция unparsed-entity-uri

Выражение для этой функции следующее:

string unparsed-entity-uri(string)

Функция

unparsed-entity-uri
возвращает уникальный идентификатор ресурса, который соответствует неразбираемой внешней сущности, имя которой передано как аргумент.

Пример

Описывая синтаксис XML, мы приводили пример документа, который использовал неразбираемые внешние сущности.

Листинг 8.67. Входящий документ использующий неразбираемые внешние сущности

<!DOCTYPE menu [

 <!ELEMENT menu (menuitem*)>

 <!ELEMENT menuitem EMPTY>

 <!ATTLIST menuitem

image ENTITY #REQUIRED

title CDATA #REQUIRED

href CDATA #REQUIRED>

 <!NOTATION gif SYSTEM "gif-viewer.exe">

 <!NOTATION jpg SYSTEM "jpg-viewer.exe">

 <!ENTITY news SYSTEM "news.gif" NDATA gif>

 <!ENTITY products SYSTEM "prod.jpg" NDATA jpg>

 <!ENTITY support SYSTEM "support.gif" NDATA gif>

]>

<menu>

 <menuitem image="news" title="News" href="#"/>

 <menuitem image="products" title="Products" href="#"/>

 <menuitem image="support" title="Support" href="#"/>

</menu>

Для

того чтобы вычислить местоположение графических файлов, соответствующих пунктам этого меню, нужно будет использовать функцию
unparsed- entity-uri
. Аргументом этой функции в данном случае будет значение атрибута
image
, ведь именно этот атрибут задает имя неразбираемой сущности, которая соответствует изображению пункта меню. Преобразование такого документа в HTML будет иметь приблизительно следующий вид.

Листинг 8.68. Преобразование, использующее функцию unparsed-entity-uri

<xsl:stylesheet

 version="1.0"

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

 <xsl:output

method="html"

indent="yes"/>

 <xsl:template match="menu">

<table>

<xsl:apply-templates select="menuitem"/>

</table>

 </xsl:template>

 <xsl:template match="menuitem">

<tr>

<td>

<A alt="{@title}" href="#">

<img src="{unparsed-entity-uri(@image)}"/>

</A>

</td>

</tr>

 </xsl:template>

</xsl:stylesheet>

Результат преобразования приведен на следующем листинге.

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

<table>

 <tr>

<td>

<A alt="News" href="#">

<img src="file:/C:/XML/news.gif"/>

</A>

</td>

 </tr>

 <tr>

<td>

<A alt="Products" href="#">

<img src="file:/C:/XML/prod.jpg"/>

</A>

</td>

 </tr>

 <tr>

<td>

<A alt="Support" href="#">

<img src="file:/С:/XML/support.gif"/>

</A>

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