Рассмотрим следующий 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 продолжает появляться пустым. Однако, если я напишу функцию, аналогичную следующей (т. е. без использования оси предков), я получу желаемый элемент "глава":
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 работает? Кроме того, есть ли у кого-нибудь какие-либо предложения о том, как решить эту проблему?
Спасибо.
РЕШЕНИЕ:
Теперь тайна разгадана.
Рассматриваемый узел был воссоздан в другой функции, что привело к удалению из него всей информации о его предке. К сожалению, предыдущий разработчик не задокументировал эту замечательную маленькую функцию, что стоило всем нам немало времени.
Итак, ось-предок работала именно так, как и должна — она просто применялась к обманчивому узлу.
Я благодарю всех вас за ваши усилия в ответах на мои вопросы.