本文介绍了在 XQuery 中组合两个 for 循环和联合结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我们有这个文件夹

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 等的结构相同...)

collection1.xml (same structure for collection2.xml, collection3.xml, etc...)

<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 等的结构相同...)

mydoc1.xml (same structure for mydoc2.xml, mydoc3.xml, etc...)

<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) collection1.xml可以包含很多标题,而mydoc1.xml在时间上只能包含1个标题.

So: 1) xml files in different folders have different structure and 2) collection1.xml can contain many titles and mydoc1.xml can contain only 1 title in time.

我想从 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**

所以,我正在寻找某种 SQLUNION";XQuery 中的替代...我有这种感觉,就像我有一些基本的愚​​蠢问题,但我是 XQuery 的新手,所以请原谅我:)

推荐答案

它可能适用

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>
  }
)

这篇关于在 XQuery 中组合两个 for 循环和联合结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-05 03:51