Чтение онлайн

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:

□ Если первый в порядке просмотра документа узел переданного множества не принадлежит никакому пространству имен, функция возвращает пустую строку.

□ В противном случае функция возвращает URI пространства имен первого в порядке просмотра документа узла переданного множества.

Функция

name
возвратит имя вида
QName
, которое будет соответствовать расширенному имени первого в порядке просмотра документа узла переданного ей множества.

Это имя должно соответствовать расширенному имени узла, то есть должны совпадать локальные части и пространства имен. Вместе с тем, это вовсе не означает, что префиксы также будут

совпадать. Например, если в элементе определены несколько префиксов для одного пространства, функция
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), чтобы генерируемые элементы содержали информацию об имени, пространстве имен и локальной части имени элементов.

Листинг 6.10. Входящий документ

<a:a

 xmlns:a="http://www.a.com"

 xmlns:b="http://www.b.com">

 <b:b>

<c/>

 </b:b>

</a:a>

Листинг 6.11. Преобразование

<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>

Листинг 6.12.
Выходящий документ

<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

node-set id(object)

Мы уже встречались с функцией

id
, когда говорили об уникальных атрибутах элементов и еще раз — когда разбирали паттерны. Функция
id
позволяет обращаться к элементам по значениями их уникальных атрибутов.

Функция

id
выполняется по-разному в зависимости от того, какой тип данных ей передается.

□ Если аргументом функции является строка, она рассматривается как набор идентификаторов, разделенных пробелами. В результирующее множество узлов войдут узлы тех элементов текущего документа, значения уникальных атрибутов которых входят в набор идентификаторов, определяемый строковым аргументом.

□ Если аргументом функции является множество узлов, результатом ее выполнения будет объединение результатов функции

id
, примененной к строковому значению каждого из узлов множества.

□ Если аргументом функции является объект другого типа, аргумент вначале преобразуется в строку и функция

id
выполняется как со строковым параметром.

Пример

Предположим, что мы используем XML для того, чтобы описать граф — множество вершин, соединенных дугами (рис. 6.11).

Рис. 6.11. Изображение графа, который мы будем описывать в XML

Каждой вершине будет соответствовать элемент

vertex
. Для того чтобы описать все связи, мы дадим каждой вершине уникальное имя, которое будет записано в ее
ID
– атрибуте
name
. Имена вершин, с которыми она соединена, будут перечислены в атрибуте
connects
типа
IDREFS
.

Документ, описывающий этот граф, может выглядеть следующим образом.

Листинг 6.13. Документ gemini.xsl

<!DOCTYPE vertices SYSTEM "gemini.dtd">

<vertices>

 <vertex name="alpha" connects="tau"/>

 <vertex name="beta" connects="upsilon"/>

 <vertex name="gamma" connects="zeta"/>

 <vertex name="delta" connects="zeta lambda upsilon"/>

 <vertex name="epsilon" connects="nu mu tau"/>

Поделиться с друзьями: