Языки информационного обмена

       

Функции id() и key()


Образец может начинаться с вызова функции id() или функции key(). Единственным аргументом функции id() служит уникальный идентификатор узла, т.е. значение его атрибута типа ID. Например, образцу id(@xref) соответствует узел-элемент, на идентификатор которого ссылается значение атрибута xref. Образцу id(<h12>) соответствует узел-элемент с идентификатором h12, а образцу id(<h12>)//street - его потомки street любого уровня вложенности.

Функция id(), работающая с атрибутами типа ID, подвержена всем ограничениям этого типа, а именно:

  • у элемента может быть только один атрибут типа ID, значит, можно cссылаться только на этот атрибут, не говоря уже о том, что такой атрибут может вообще отсутствовать:
  • значение атрибута типа ID уникально, значит, нельзя обратиться сразу к нескольким элементам;
  • значение атрибута типа ID может быть только именем типа Name, значит, не может быть числом, содержать пробелы и многие другие символы;
  • схема, в которой определен тип ID атрибута, может оказаться недоступной для процессора XSLT и он не "узнает" тип атрибута;
  • функция id() работает только с атрибутами, но не с элементами, их содержимым и прочими узлами дерева документа;
  • для внесения новых перекрестных ссылок в документ XML надо его менять, вставляя атрибуты типа ID, что может быть нежелательно или невозможно.

Функция key() менее требовательна. Она снимает ограничения функции id(), обращаясь не к атрибуту элемента, находящегося в документе ХМL, а к атрибуту use специального элемента xsl:key, расположенного в таблице стилей. У нее два аргумента:

  • имя ключа, задаваемое строкой типа QName; это значение атрибута name элемента xsl:key, позволяющее выбрать нужный элемент xsl:key.
  • значение ключа, представляющее собой выражение, в результате вычисления которого получается последовательность из одного или нескольких атомарных значений типа xdt:anyAtomicType.

Образец с функцией key() выглядит примерно так: key("addr", 230007)//street.

Элемент xsl:key определяет ключ и множество значений, а функция key() выбирает из этого множества те значения, что совпадают со вторым аргументом функции key(). Таким образом, при необходимости создания новых ссылок в исходном документе XML, его не надо изменить, достаточно добавить новые элементы xml:key в таблицу стилей.



Содержание раздела