Учитывая этот xml документ:
<?xml version="1.0" encoding="UTF-8"?>
<mydoc>
<foo f="fooattr">
<bar r="barattr1">
<baz z="bazattr1">this is the first baz</baz>
</bar>
<bar r="barattr2">
<baz z="bazattr2">this is the second baz</baz>
</bar>
</foo>
</mydoc>
это обрабатывается этим xquery:
let $d := doc('file:///Users/mark/foo.xml')
let $barnode := $d/mydoc/foo/bar/baz[contains(@z, '2')]
let $foonode := $barnode/../../@f
return $foonode
Я получаю следующую ошибку:
"Cannot create an attribute node (f) whose parent is a document node".
Кажется, что../операция является видом удаления узлов соответствия от остальной части документа, таким образом, что это думает, что это - узел документа.
Я открыт для других подходов, но выбор родителя зависит от дочернего атрибута, содержащего определенную подстроку.
За Ваше здоровье!
Запрос, который вы написали, выбирает атрибут f. Однако не законно вернуть атрибут узел из XQuery. Ошибка обращается к выходному документу, который здесь содержит только атрибут (хотя это сообщение об ошибке вводит в заблуждение, так как технически нет выходного документа здесь, есть только узел атрибута, который возвращается).
Вы, вероятно, хотели вернуть значение атрибута, а не самого атрибута
return data($foonode)