Рассмотрим следующий XML
фрагмент:
<doc>
<chapter id="1">
<item>
<para>some text here</para>
</item>
</chapter>
</doc>
В XQuery
у меня есть функция, которая должна делать некоторые вещи на основе главы предка данного "para "элемент, который передается как параметр, как показано в урезанном примере ниже:
declare function doSomething($para){
let $chapter := $para/ancestor::chapter
return "some stuff"
};
В этом примере $ chapter продолжает появляться пустым.Однако, если я напишу функцию, аналогичную следующей (т.е. без использования оси предка ), я получу желаемый элемент "chapter":
declare function doSomething($para){
let $chapter := $para/../..
return "some stuff"
};
Проблема в том, что яне может использовать явные пути, как в последнем примере, потому что XMl
, который я буду искать, не гарантирует, что элемент "chapter" будет прародителем каждый раз.Это может быть прапрадедушка или прапрадедушка и т. Д., Как показано ниже:
<doc>
<chapter id="1">
<item>
<subItem>
<para>some text here</para>
</subItem>
</item>
</chapter>
</doc>
Есть ли у кого-нибудь объяснения относительнопочему ось не работает, а явная XPath работает?Кроме того, у кого-нибудь есть какие-либо предложения о том, как решить эту проблему?
Спасибо.
РЕШЕНИЕ:
Тайна теперь разгадана.
Узел, о котором идет речь, был воссоздан в другой функции, что привело к удалению из него всей информации о его предке.К сожалению, предыдущий разработчик не задокументировал эту замечательную, маленькую функцию и стоил нам всем большого количества времени.
Итак, ось предка работала именно так, как и должна - она просто применялась к обманчивому узлу.
Я благодарю всех вас за ваши усилия ответить на мои вопросы.