Как получить дочерние элементы, но не их детей? - PullRequest
5 голосов
/ 21 октября 2011

Использование MarkLogic, но это, вероятно, общий вопрос XQuery.

У меня есть:

<library>
  <books>
    <book title="whatever">
      <publisher>Random</publisher>
      ....more children
    </book>
    <book title="another">
      <publisher>Simon</publisher>
      ....more children
    </book>
    ...
  </books>
</library>

Я хочу вернуть все элементы [book] с их атрибутами title, но я НЕ хочу, чтобы кто-либо из потомков книги, например, [Издатель]. Как мне сделать это в ортодоксальной и исполнительской манере?

Соотнесенный вопрос: иногда я могу хотеть получить некоторых детей, но не других, например. получить все элементы книги и их дочерние элементы издателя, но не другие дочерние элементы.

Спасибо.

Ответы [ 4 ]

4 голосов
/ 22 октября 2011

XQuery (на самом деле XPath, который является подмножеством XQuery) /library/books/book технически делает то, что вы хотите - он возвращает набор элементов книги, и ничего больше. Некоторые API возвращают ссылки на элементы книги и оставляют вас решать, что вы хотите с ними делать, например, отображать их заголовки. Однако многие инструменты и API копируют эти элементы книги вместе со всем поддеревом, укорененным в книге, и в случае базы данных это очень часто результат, который будет передаваться по сети с сервера на клиент. В этом случае вы не хотите выбирать существующие элементы книги, вы хотите создать новый документ, содержащий подмножество информации в элементах книги. Для этого вы можете использовать конструкторы элементов в XQuery:

for $b in /library/books/book
return <book title="{$b/@title}"/>
1 голос
/ 21 октября 2011

Возможно, есть более простые способы ... но я думаю, что-то вроде этого скопирует атрибуты без других потомков. Предупреждение: код не проверен

for $i in doc()//book
return <book>{
    for $a in $i/@*
    return $a
}</book>
0 голосов
/ 22 ноября 2011

Я думаю, что лучшим решением Майкла Кея было бы не перечислять каждый желаемый атрибут и сделать его немного более общим.Следует отметить, что /@ возвращает атрибут, а не только текст.

Например:

for $book in /library/books/book return <book>{$book/@*}</book>

или, в более общем случае:

for $book in /library/books/book return element book {$book/@*}
0 голосов
/ 21 октября 2011

Проверьте синтаксис выбора XQuery по ссылке ниже.Выбор синтаксиса обычно позволяет вам получить интересующие вас элементы данных, отформатировать их так, как вы хотите, и пропустить то, что вас не волнует.

http://www.w3schools.com/xquery/xquery_select.asp

...