Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППТС-2 / Лекции / Lect4-08.doc
Скачиваний:
5
Добавлен:
12.05.2015
Размер:
422.91 Кб
Скачать

5.3.19.2. Функцияcurrent()

Функция current()возвращает множество, состоящее из текущего узла преобразования, и имеет следующее описание:

набор-узловcurrent().

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

Предположим, что нужно выбрать элементы toсо значением атри­бутаaddress, равным значению этого атрибута у текущего узла.

Путь выборки будет выглядеть как to[предикат], где предикат должен определять ус­ловие равенства атрибутов текущего узла и выбираемого узла. Предикат будет вычисляться в контексте проверяемого элементаto, поэтому все относительные пути выборки типа@addressили./@addressилиself::to/@addressбудут отсчитываться именно от проверяемого эле­мента. В этом случае узел контекста и текущий узел преобразования – не одно и то же.

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

to[@address=current()/@address].

Это выражение выберет все дочерние элементы toтекущего узла, значе­ние атрибутаaddressкоторых будет таким же, как и у него.

5.3.19.3. Функцияgenerate-id()

Функция generate-id()возвращает уникальный строковый идентификатор первого в порядке просмотра документа узла, передаваемого ей в виде аргу­мента. Описание функции имеет следующий вид:

строкаgenerate-id(набор-узлов).

Если аргумент опущен, функция возвращает уникальный идентифи­катор контекстного узла. Если аргументом является пустое множество, функция должна возвращать пустую строку.

Функция generate-id()обладает следующими свойствами:

  • функция возвращает для двух узлов один и тот же иденти­фикатор тогда и только тогда, когда эти два узла совпадают (т.е. для разных узлов функция обязательно возвратит разные идентифи­каторы);

  • возвращаемый идентификатор состоит только из цифр и букв ASCIIи начинается буквой (то есть идентификатор синтаксически является корректным именемXMLи может использоваться как имя элемента, атрибута, как значе­ние атрибута ID или в любом другом месте, где могут использоваться именаXML).

Спецификация не определяет никакого стандартного метода реализации функции generate-id(), поэтому каждый процессор может генерировать иденти­фикатор по-своему.

Пример использования функции generate-id():

Присваивание заголовкам сообщений в message.xmlуникального идентификатора сообщения в атрибутеid:

<?xml version="1.0" encoding="Windows-1251"?>

<xsl:stylesheet version="1.0"

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

<xsl:output method="xml"

encoding="Windows-1251" indent="yes"/>

<xsl:template match="@*|node()">

<xsl:copy>

<xsl:apply-templates select="@*|node()"/>

</xsl:copy>

</xsl:template>

<xsl:template match="header">

<xsl:copy>

<xsl:attribute name="id">

<xsl:value-of select="generate-id()"/>

</xsl:attribute>

<xsl:apply-templates select="@*|node()"/>

</xsl:copy>

</xsl:template>

</xsl:stylesheet>.

В результате выполнения этого преобразования в процессоре MSXMLэлементы заголовков первого и второго сообщений будут выглядеть следующим образом:

<header id="IDA4ASKB">

<header id="IDAHBSKB">,

а в процессоре Saxon:

<header id="d0e5">

<header id="d0e18">.

Соседние файлы в папке Лекции