Существует стандартная функция XPath для ссылки на элементы по их атрибуту "id" .
Из XPath 1.0 spec .:
Функция id()
выбирает элементы по их уникальным ID
(см. [5.2.1 Уникальные идентификаторы]). Если аргумент id
имеет тип node-set
, то результатом является объединение результата применения id
к string-value
каждого из узлов в аргументе node-set
. Когда аргумент id
относится к какому-либо другому типу, аргумент преобразуется в string
, как будто путем вызова string function
; string
делится на whitespace-separated list of tokens
(whitespace
- любая последовательность символов, соответствующая производной S
); В результате получается node-set
, содержащий элементы в том же document
, что и context node
, которые имеют unique ID
, равный любому из токенов в списке.
Другой, более общий способ ссылки на узлы (не только элементы) возможен в XSLT . Инструкция <xsl:key/>
и функция XSLT key()
специально разработаны для этой цели.
Например, , предположим, что документ содержит библиографические ссылки в форме XSLT, и существует отдельный документ XML bib.xml, содержащий библиографическую базу данных с записями в форме:
<entry name="XSLT">...</entry>
Тогда таблица стилей может использовать следующее для преобразования элементов bibref :
<xsl:key name="bib" match="entry" use="@name"/>
<xsl:template match="bibref">
<xsl:variable name="name" select="."/>
<xsl:for-each select="document('bib.xml')">
<xsl:apply-templates select="key('bib',$name)"/>
</xsl:for-each>
</xsl:template>
Обратите внимание , что ключи в XSLT преодолевают следующие ограничения функции id()
:
Атрибуты идентификатора должны быть объявлены как
такой в DTD. Если идентификатор атрибута
объявляется только как атрибут ID
во внешнем подмножестве DTD, то это
будет распознан как атрибут ID
только если процессор XML читает
внешнее подмножество DTD. Тем не менее, XML
не требует, чтобы процессоры XML
читать внешние DTD, и они могут
хорошо, чтобы не делать этого, особенно
если документ объявлен
standalone="yes"
.
Документ может содержать только один
набор уникальных идентификаторов. Там не может быть
отдельные независимые наборы уникальных
Идентификаторы.
Идентификатор элемента может быть только
указывается в атрибуте; это не может
быть определено содержанием
элементом или дочерним элементом.
Идентификатор должен быть XML
название. Например, он не может содержать
пространства.
Элемент может иметь не более одного идентификатора.
Максимум один элемент может иметь
конкретный ID.
Из-за этих ограничений XML-документы иногда содержат структуру перекрестных ссылок, которая явно не объявлена атрибутами ID / IDREF / IDREFS.