Листинг 8.64. Документ doc.xml
doc.xml
Листинг 8.65. Документ a/doc.xml
a/doc.xml
Листинг 8.66. Выходящий документ
doc.xml
doc.xml
a/doc.xml
a/doc.xml
doc.xml
Вызов 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
Выражение для этой функции имеет вид:
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 . Входящий документ использующий неразбираемые внешние сущности
Для того чтобы вычислить местоположение графических файлов, соответствующих пунктам этого меню, нужно будет использовать функцию unparsed- entity-uri
. Аргументом этой функции в данном случае будет значение атрибута image
, ведь именно этот атрибут задает имя неразбираемой сущности, которая соответствует изображению пункта меню. Преобразование такого документа в HTML будет иметь приблизительно следующий вид.
Листинг 8.68. Преобразование, использующее функцию unparsed-entity-uri
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
method="html"
indent="yes"/>
|
Результат преобразования приведен на следующем листинге.
Листинг 8.69. Выходящий документ
Остается только добавить, что unparsed-entity-uri
— это единственная функция, которая позволяет работать с неразбираемыми сущностями. Никаких средств для обработки нотаций и вспомогательных приложений, которые им соответствуют, в XSLT нет. Сказывается тот факт, что неразбираемые сущности и нотации очень редко используются в документах, поэтому их поддержка в XSLT минимальна.
Синтаксическая конструкция этой функции:
string generate-id( node-set? )
Функция generate-id
возвращает уникальный строковый идентификатор первого в порядке просмотра документа узла, передаваемого ей в виде аргумента. Если аргумент опущен, функция возвращает уникальный идентификатор контекстного узла. Если аргументом является пустое множество, функция должна возвращать пустую строку.
Функция generate-id
обладает следующими свойствами.
Читать дальше