Как использовать функцию XQuery fn: idref ()? - PullRequest
1 голос
/ 22 июня 2011

Я не могу заставить функцию XQuery fn:idref() что-либо возвращать.

У меня есть этот документ XML doc.xml ;

<doc>
  <foo idref="xyz"/>
  <bar xml:id="xyz"/>
</doc>

И этоXQuery;

let $d := doc("doc.xml")
return $d/idref("xyz")

Но результат всегда пуст.Я предполагаю, что атрибут idref="xyz" должен быть объявлен как тип idref, но можно ли это сделать без схемы?

Я использую процессор Saxon XQuery 1.0.

1 Ответ

3 голосов
/ 22 июня 2011

Да, функция idref () извлекает только атрибуты, помеченные как IDREF, и это происходит только в результате проверки схемы.

Существует устаревший устаревший параметр config.setRetainDTDAttributeTypes (), который позволяет работать в результате проверки DTD, но я бы не стал его использовать.

Вы всегда можете сделать doc("doc.xml")//*[@idref="xyz"]. Это приведет к последовательному поиску в Saxon-HE и Saxon-PE, но будет использовать индекс в Saxon-EE. Я бы вообще рекомендовал это использовать функцию idref().

В XSLT, конечно, вы можете использовать ключи.

...