
- •Лекция 4-08
- •5.3.9. Создание текстовых узлов вXslt
- •5.3.9.1. Элементxsl:text
- •5.3.9.2. Элементxsl:value-of
- •5.3.9.3. Встроенные правила шаблона
- •1. Поздравление
- •2. Напоминание
- •5.3.9.4. Обработка пробельных символов
- •5.3.10. Создание узлов документа, комментариев, инструкций по обработке и пространства имен вXslt
- •5.3.10.1. Элемент xsl:document
- •5.3.10.2. Элементxsl:result-document
- •5.3.10.3. Элементxsl:comment
- •5.3.10.4. Элемент xsl:processing-instruction
- •5.3.10.5. Элементxsl:namespace
- •5.3.11. Копирование узлов вXslt
- •5.3.11.1. Элементxsl:copy
- •5.3.11.2. Элементxsl:copy-of
- •5.3.11.3. Элементxsl:sequence
- •5.3.12. Условная и циклическая обработка вXslt
- •5.3.12.1. Элементxsl:if
- •5.3.12.2. Элементы xsl:choose, xsl:when и xsl:otherwise
- •5.3.12.3. Элементxsl:for-each
- •5.3.12.4. Сортировка вXslt
- •5.3.13. Сообщения процессораXslt
- •5.3.14. Псевдонимы пространства имен вXslt
- •5.3.15. Нумерация вXslt
- •3. Поздравление
- •1. Поздравление
- •1. Поздравление
- •01). Поздравление
- •0:00:00:00:01)Поздравление
- •5.3.16. Форматирование чисел в xslt
- •5.3.17. Использование ключей вXslt
- •5.3.18. Переменные, параметры и функции вXslt
- •5.3.18.1. Переменные в xslt
- •5.3.18.2. Вызов именованных правил шаблона
- •5.3.18.3. Параметры в xslt
- •5.3.18.4. Функции стилей в xslt
- •5.3.19. Дополнительные функции xslt
- •5.3.19.1. Функцияdocument()
- •5.3.19.2. Функцияcurrent()
- •5.3.19.3. Функцияgenerate-id()
- •5.3.19.4. Функция system-property()
- •5.3.19.5. Функцияunparsed-entity-uri()
- •5.3.20 Использование расширений вXslt
- •5.3.20.1. Средства расширенияXslt
- •5.3.20.2. Инициатива exslt
- •5.3.20.3. Средства расширения в процессореMsxml
- •5.3.20.4. Средства расширения в процессореSaxon
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">.