Объедините два цикла for и объедините результаты в XQuery

Допустим, у нас есть эти папки

not_my_files
    collections
        collection1.xml
        collection2.xml
        collection3.xml
        etc...
my_files
    my_documents
        mydoc1.xml
        mydoc2.xml
        mydoc3.xml
        etc...

Есть структура xml файлов

collection1.xml (такая же структура для collection2.xml, collection3.xml и т. д.)

<collection xml:id="name_of_collection_1">
    <ref id="id_of_ref_1">
        <title>This is title 1 of first document in this collection</title>
    </ref>
    <ref  id="id_of_ref_2">
        <title>This is title 2 of second document in this collection</title>
    </ref>  
</collection>

mydoc1.xml (такая же структура для mydoc2.xml, mydoc3.xml и т. д.)

<mydoc id="my_doc_id_1">
    <tag1>
        <tag2>
            <reference_tag>
                <my_title>This is title 1 of my documents</my_title>
            </reference_tag>
        </tag2>
    </tag1>
</mydoc>

Итак: 1) XML-файлы в разных папках имеют разную структуру и 2) c ollection1.xml может содержать много заголовков, а mydoc1.xml может содержать только 1 заголовок во времени.

Я хочу получить все заголовки как из collections / collection1.xml (и т. Д.), Так и из my_documents / mydoc1.xml (т. Д.). Это желаемый результат:

<doc>
    <folder>Not my files</folder>
    <title>This is title 1 of first document in this collection</title>
</doc>
<doc>
    <folder>Not my files</folder>
    <title>This is title 2 of second document in this collection</title>
</doc>
<doc>
    <folder>My files</folder>
    <title>This is title 1 of my documents</title>
</doc>

Мой текущий XQuery:

xquery version "3.1";

for $doc_not_my_files in collection("/not_my_files/collections")
   let $folder_not_my_files := "Not my files"

for $ref in $doc_not_my_files//ref
   let $title_not_my_files := $ref/title/text()

for $doc_my_files in collection("/my_files/my_documents")
   let $folder_my_files := "My files"
    let $title_my_files := $doc_my_files//reference_tag/my_title/text()

return
        if ($folder_my_files="My files") 
            then
                <doc>
                    <folder>{$folder_my_files}</folder>
                    <title>{$title_my_files}</title>
                </doc>
        else 
                <doc>
                    <folder>{$folder_not_my_files}</folder>
                    <title>{$title_not_my_files}</title>
                </doc>

Мой текущий результат:

<doc>
    <folder>My files</folder>
    <title>This is title 1 of my documents</title>
</doc>
<doc>
    <folder>My files</folder>
    <title>This is title 1 of my documents</title>
</doc>
<doc>
    <folder>My files</folder>
    <title>This is title 1 of my documents</title>
</doc>
<doc>
    <folder>My files</folder>
    <title>This is title 1 of my documents</title>
</doc>
**etc... 1000 times** 
<doc>
    <folder>Not my files</folder>
    <title>This is title 1 of first document in this collection</title>
</doc>
<doc>
    <folder>Not my files</folder>
    <title>This is title 1 of first document in this collection</title>
</doc>
<doc>
    <folder>Not my files</folder>
    <title>This is title 1 of first document in this collection</title>
</doc>
**etc... another 1000 times**

Итак, я ищу какую-то альтернативу SQL UNION в XQuery ... У меня такое чувство, будто у меня есть какой-то простой глупый вопрос, но я новичок в XQuery, так что простите меня :)


person ag_1812    schedule 21.10.2020    source источник
comment
Имеет ли значение порядок результатов? Есть ли какой-либо порядок во входных данных, и есть ли два разных входа, связанных с ассоциацией, например. mydoc1.xml с collection1.xml?   -  person Martin Honnen    schedule 21.10.2020
comment
Нет, порядок результатов не имеет значения. Нет, к сожалению, нет никакой возможной связи между mydoc1.xml и collection1.xml (поэтому невозможно выполнить простое соединение по некоторым критериям…)   -  person ag_1812    schedule 21.10.2020


Ответы (1)


Это может работать с

for-each-pair(
  collection("/my_files/my_documents"),
  collection("/not_my_files/collections"),
  function($doc, $col) {
    $doc//reference_tag/my_title/text() ! <doc>
                    <folder>My files</folder>
                    <title>{.}</title>
                </doc>,
    $col//ref/title/text() ! <doc>
                    <folder>Not my files</folder>
                    <title>{.}</title>
                </doc>
  }
)
person Martin Honnen    schedule 21.10.2020
comment
Большое спасибо! Это работает хорошо! Можно ли добавить в эту функцию дополнительные данные? Допустим, я хочу добавить id. Это будет let $id := data($doc//ref/@id) для collection1.xml и let $id := data($col/mydoc/@id) для mydoc1.xml. Есть ли шанс добавить этот код в вашу функцию? Большое спасибо за любую помощь !!! - person ag_1812; 21.10.2020
comment
Ничего, я понял, как добавить этот id’s в работу. Но у меня есть еще один вопрос: если я хочу добавить предложение where (чтобы иметь возможность манипулировать или выбирать результат), где я должен поместить это предложение в вашу функцию? Спасибо заранее! - person ag_1812; 21.10.2020
comment
@ ag_1812, не торопитесь, чтобы попытаться понять подход и адаптировать его к своим потребностям. Если возникают новые проблемы, задайте новый вопрос с подробностями о том, какое условие вам нужно для каких элементов (элементы ввода или элементы результатов)). В любом месте вышеупомянутого выражения вы, безусловно, можете использовать выражение FLOWR, например. вместо collection("/my_files/my_documents") вы можете использовать, например, for $colDocs in collection("/my_files/my_documents") where ... return $colDocs. - person Martin Honnen; 21.10.2020
comment
Спасибо, отлично подходит для пункта where. Вы правы, каждому языку нужно время, чтобы овладеть им. Хотелось бы, чтобы у меня было достаточно времени, чтобы изучить их все, но сейчас у меня есть только несколько дней для запросов Xquery, и после этого мне нужно перейти к другому проекту. Надеюсь, stackoverflow поможет! В любом случае, еще раз спасибо за вашу помощь! - person ag_1812; 21.10.2020