Листинг 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обладает следующими свойствами.
Читать дальше