12.2 Ключи
Ключи дают возможность работать с документами, имеющими неявную структуру перекрестных ссылок. В XML атрибуты типа
– Атрибуты ID должны быть декларированы в качестве таковых в DTD. Если атрибут ID декларирован в качестве такового лишь во внешнем наборе DTD, то и распознаваться как ID атрибут он будет только тогда, когда процессор XML прочтет этот внешний набор DTD. Однако спецификация XML вовсе не обязует XML процессоры читать этот внешний DTD, а потому процессоры вполне могут этого не делать, особенно если для документа было декларировано
– Документ может иметь только один набор уникальных ID. Не может быть несколько независимых наборов уникальных атрибутов ID.
– ID элемента может быть задано лишь в атрибуте. Он не может быть задан ни содержимым элемента, ни элементом, являющимся непосредственным потомком.
– ID должен быть именем XML. Например, он не может содержать пробелов.
– Элемент может содержать не более одного ID.
– Любой конкретный ID может принадлежать только одному элементу.
– Из-за этих ограничений документы XML иногда имеют структуру перекрестных ссылок, которая не была явно декларирована атрибутами ID/IDREF/IDREFS.
Ключ определяется тремя параметрами:
– узлом, которому принадлежит этот ключ
– названием ключа (расширенное имя)
– значением ключа (строка)
Набор ключей для каждого документа декларируется в стиле с помощью элемента
Таким образом, ключ – это такой тип обобщенного ID, на который не распространяются ограничения, принятые для ID в XML:
Ключи декларируются в стиле с помощью элементов
Ключи имеют как название, так и значение. Каждое название ключа можно рассматривать как отдельное, независимое пространство идентификаторов.
Для элемента значение именованного ключа можно указать в любом удобном месте, например, в содержимом самого элемента, в атрибуте или элементе, являющемся непосредственным потомком. Место, где следует искать значение конкретного именованного ключа, задается выражением XPath.
Значением ключа может быть произвольная строка и это не обязательно должно быть имя.
В документе может быть несколько ключей, относящихся к одному и тому же узлу и имеющих одно и то же название, но с различными значениями ключа.
В документе может быть несколько ключей, имеющих одно и то же название ключа, одно и то же значение, но относящихся к различным узлам.
<!– Category: top-level-element ->
<xsl:key
name = qname
match = pattern
use = expression />
Чтобы декларировать ключи, используется элемент
x соответствует шаблону, указанному в атрибуте
атрибут
если выражение, заданное атрибутом
Заметим также, что одному узлу может соответствовать несколько элементов
Если значение атрибутов
Функция id играет для