XQuery для элементов

Я знаю, как использовать инструкцию For для создания цикла в коллекции или в документе, но у меня возникают проблемы с созданием цикла в элементе()*

содержимое элемента()*:

<Placemark>
    <blabla id="1">
        <value>abcd</value>
    </blabla>
    <blabla id="2">
        <value>abcd</value>
    </blabla>
    ...
</Placemark>
<Placemark>
    ...
</Placemark>

Теперь мне нужны, например, только элементы <blabla>. С классическим циклом в документе я получаю доступ следующим образом:

for $x in doc("/db/data.xml")/Placemark
return $x

но с циклом на элементе () * это не работает так:

declare function local:fct($content as item()*) as item()* {
    for $x in $content/Placemark
    return $x
};

У меня нет ошибки, просто пустой результат. Кто-то знает, почему это не работает?


person user2547762    schedule 03.07.2013    source источник


Ответы (2)


Поскольку ваш цикл уже перебирает Placemark элементов, ваше решение запрашивает Placemark дочерних элементов Placemark, что пусто.

declare function local:fct(
  $content as element(Placemark)*
) as element(blabla)* {
    for $x in $content
    return $x/blabla
};
person wst    schedule 03.07.2013
comment
Спасибо, работает исправно. В следующий раз я постараюсь больше, прежде чем задать простой вопрос... - person user2547762; 03.07.2013
comment
@ user2547762 Не беспокойтесь. Одна вещь, которая мне полезна, — это всегда строго печатать аргументы функции, как указано выше. Это облегчает запоминание того, что содержат все переменные, когда вы пишете запрос. - person wst; 03.07.2013

Если бы вы передавали родительский элемент Placemark в функцию как значение параметра $content, ваш код был бы в порядке. Но это выглядит так, как будто вы вызываете функцию с некоторым выражением вроде local:fct(doc(...)//Placemark), что означает, что члены последовательности $content сами являются элементами Placemark. Затем ваша функция запрашивает их дочерние элементы Placemark; их нет, поэтому вы получаете пустую последовательность.

Пересмотренная функция, предложенная wst, — прекрасный способ решить проблему; передача родителей элементов Placemark в качестве значения $content была бы еще одним прекрасным способом.

person C. M. Sperberg-McQueen    schedule 03.07.2013