Как использовать функцию XQuery fn:idref()?

Я не могу получить функцию 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 ответ

Решение

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

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

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

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

Другие вопросы по тегам