name
может использовать любой из них.
Для следующего элемента
<a:body
xmlns:a='http://www.a.com'
xmlns:b='http://www.a.com'
xmlns:c='http://www.a.com'/>
функция name
может вернуть a:body
, b:body
или c:body
.
Большинство процессоров все же возвращает префикс, с которым узел был объявлен.
Так же как local-name
и namespace-uri
, функция name имеет следующие особенности использования.
□ Если аргумент опущен, то его значением по умолчанию является множество, содержащее единственный контекстный узел.
□ Если аргументом является пустое множество, то функция возвращает пустую строку.
□ Если первый в порядке просмотра документа узел переданного множества не имеет расширенного имени, то функция возвращает пустую строку.
□ В противном случае функция возвращает имя вида QName
, соответствующее расширенному имени первого в порядке просмотра документа узла переданного множества.
Мы можем видоизменить преобразование, приведенное в примере к функциям last
и position
(листинг 6.7), чтобы генерируемые элементы содержали информацию об имени, пространстве имен и локальной части имени элементов.
<a:a
xmlns:a='http://www.a.com'
xmlns:b='http://www.b.com'>
<b:b>
<c/>
</b:b>
</a:a>
<xsl:stylesheet
version='1.0'
xmlns:xsl='http: //www.w3.org/1999/XSL/Transform'
xmlns:a='http://www.a.com'
xmlns:b='http://www.b.com'>
<xsl:output indent='yes'/>
<xsl:template match='*'>
<element
name='{name()}'
namespace-uri='{namespace-uri()}'
local-name='{local-name()}'>
<xsl:apply-templates/>
</element>
</xsl:template>
</xsl:stylesheet>
<element
xmlns:a='http://www.a.com'
xmlns:b='http://www.b.com'
name='a:a'
namespace-uri='http://www.a.com'
local-name='a'>
<element name='b:b'
namespace-uri='http://www.b.com'
local-name='b'>
<element name='c'
namespace-uri=''
local-name='c'/>
</element>
</element>
Функция
Мы уже встречались с функцией id
, когда говорили об уникальных атрибутах элементов и еще раз — когда разбирали паттерны. Функция id
позволяет обращаться к элементам по значениями их уникальных атрибутов.
Функция id
выполняется по-разному в зависимости от того, какой тип данных ей передается.
□ Если аргументом функции является строка, она рассматривается как набор идентификаторов, разделенных пробелами. В результирующее множество узлов войдут узлы тех элементов текущего документа, значения уникальных атрибутов которых входят в набор идентификаторов, определяемый строковым аргументом.
□ Если аргументом функции является множество узлов, результатом ее выполнения будет объединение результатов функции id
, примененной к строковому значению каждого из узлов множества.
□ Если аргументом функции является объект другого типа, аргумент вначале преобразуется в строку и функция id
выполняется как со строковым параметром.
Предположим, что мы используем XML для того, чтобы описать граф — множество вершин, соединенных дугами (рис. 6.11).

Рис. 6.11. Изображение графа, который мы будем описывать в XML
Каждой вершине будет соответствовать элемент vertex
. Для того чтобы описать все связи, мы дадим каждой вершине уникальное имя, которое будет записано в ее ID
-атрибуте name
. Имена вершин, с которыми она соединена, будут перечислены в атрибуте connects
типа IDREFS
.
Документ, описывающий этот граф, может выглядеть следующим образом.
<!DOCTYPE vertices SYSTEM 'gemini.dtd'>
<vertices>