Как использовать функцию 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, конечно, вы можете использовать ключи.