关于 xml:XQuery 嵌套 For 循环 | 珊瑚贝

XQuery Nested For Loop


我有一个示例 xml 文件,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<user_manual document-type=“IU” ts-cover=“Language Part alt” ts-lang=“-“ ts-multi=“Language Part, Chapter” ts-overview=“-“ metadata1=“9211” brand=“Bosch” material-number=“dummy_9000727237” vib=“RW404960” language-codes=“de, en” production-date=“2012-12-03” layout-type=“-“ id=“SL9761901”>

<language_part id=“ecls_bio_becls_a3_a14686169.SL9761756.7” role=“-“ lang=“de”>

<?ecls-start-embedded-resource resource=“ecls_bio_becls_a3_a17144756”?>
<user_manual_part id=“ecls_bio_becls_a3_a17144756.SL9765760.11” role=“-“ document-type=“IU”>

<?ecls-start-embedded-resource resource=“ecls_bio_becls_a3_a30660983”?>
<chapter id=“ecls_bio_becls_a3_a30660983.SL2300626.14” role=“-“ toctitle=“yes” footrowtitle=“no” type=“security”>

<?ecls-start-embedded-resource resource=“ecls_bio_becls_a3_a611713”?>
<title_module id=“ecls_bio_becls_a3_a611713.SL873735.16” role=“-“>
<title id=“ecls_bio_becls_a3_a611713.SL873736.17”>Sicherheits- und Warnhinweise
</title_module>
<?ecls-end-embedded-resource resource=“ecls_bio_becls_a3_a611713”?>
</embed-title_module>

<?ecls-start-embedded-resource resource=“ecls_bio_becls_a3_a11752692”?>  
<section id=“ecls_bio_becls_a3_a11752692.SL1742298.19” footrowtitle=“no” role=“-“ toctitle=“yes”>
<?Pub Caret1?>

<?ecls-start-embedded-resource resource=“ecls_bio_becls_a3_a16181733”?>
<title_module id=“ecls_bio_becls_a3_a16181733.SL984238.21” role=“-“>
<title id=“ecls_bio_becls_a3_a16181733.SL984239.22”>Bevor Sie das Gerat in Betrieb nehmen
<para id=“ecls_bio_becls_a3_a16181733.SL984240.23”>Lesen Sie Gebrauchs- und Montageanleitung aufmerksam durch! Sie enthalten wichtige Informationen ?ber Aufstellen, Gebrauch und Wartung des Ger?tes.</para>
<para id=“ecls_bio_becls_a3_a16181733.SL984241.24”>Der Hersteller haftet nicht, wenn Sie die Hinweise und Warnungen der Gebrauchsanleitung missachten. Bewahren Sie alle Unterlagen f?r sp?teren Gebrauch oder f?r Nachbesitzer auf.</para>
</title_module>
<?ecls-end-embedded-resource resource=“ecls_bio_becls_a3_a16181733”?>
</embed-title_module>
</section>
<?Pub *0000000275?>
<?ecls-end-embedded-resource resource=“ecls_bio_becls_a3_a11752692”?>
</embed-section>
</chapter>
</embed-chapter>
</user_manual_part>
</embed-user_manual_part>
</language_part>
</embed-language_part>
</user_manual>

我想使用 XQuery 语言,但我对这种查询语言真的很陌生。

我需要的基础设施是这样的:我想获取章节及其标题的章节,例如:

章节就像在这个xml文件中:

1
2
3
4
5
6
    <chapter id=“ecls_bio_becls_a3_a30660983.SL2300626.14” role=“-“ toctitle=“yes” footrowtitle=“no” type=“security”>
   
    <?ecls-start-embedded-resource resource=“ecls_bio_becls_a3_a611713”?>
    <title_module id=“ecls_bio_becls_a3_a611713.SL873735.16” role=“-“>
    <title id=“ecls_bio_becls_a3_a611713.SL873736.17”>Sicherheits- und Warnhinweise

在该示例中,Sicherheits-ind Warnhinweise 是章节元素的标题。章节可以有很多部分,在我们的示例部分的标题是:

1
2
3
4
5
6
7
       <section id=“ecls_bio_becls_a3_a11752692.SL1742298.19” footrowtitle=“no” role=“-“ toctitle=“yes”>
        <?Pub Caret1?>
       
        <?ecls-start-embedded-resource resource=“ecls_bio_becls_a3_a16181733”?>
        <title_module id=“ecls_bio_becls_a3_a16181733.SL984238.21” role=“-“>
        <title id=“ecls_bio_becls_a3_a16181733.SL984239.22”>Bevor Sie das Gerat in Betrieb nehmen

Bevor Sie das Gerat in Betrieb nehmen.

预期的结构:

1
2
3
4
<chapter> title:“Chapter’s title”
<section>title:“First section’s title”</section>
<section>title:“Second section’s title”</section>
</chapter>

对于那个示例章节只有一个部分,但我只是配置了这一章来解决我的文件,我猜这是最易读的配置…

我在下面的 xquery 查询中尝试过:

1
2
3
4
5
6
<chapter
    let $doc := doc(“Test.xml”)
    for $chapter in $doc/user_manual/embed-language_part/language_part/embed-user_manual_part/user_manual_part/embed-chapter/chapter
        let $chapter_title := $chapter/embed-title_module/title_module/title
        for $section in $chapter/embed-section/section
        return <chapter>title:{data($chapter_title)} <section> title:{data($section/embed-title_module/title_module/title)}</section></chapter>

有两个嵌套循环,但是这段代码使我的结构像:

1
2
<chapter>title:“Chapter’s title”<section>“First section’s title”</section></chapter>
<chapter>title:“Chapter’s title”<section>“Second section’s title”</section></chapter>

问题是循环的,但是当我尝试编辑这样的代码时:

1
2
3
4
5
6
7
let $doc := doc(“assemble.xml”)
    for $chapter in $doc/user_manual/embed-language_part/language_part/embed-user_manual_part/user_manual_part/embed-chapter/chapter
        let $chapter_title := $chapter/embed-title_module/title_module/title
        <chapter> title:{data($chapter_title)} {
        for $section in $chapter/embed-section/section
        return <section> title:{data($section/embed-title_module/title_module/title)}</section>
        }</chapter>

我只想将标签放在第一个循环中,之后我将添加部分元素进行查询。但是上面的命令不符合我的期望。

所以我需要你的建议来正确获得这些结构。先感谢您。我希望我被清楚地告诉你们所有人的情况。假定为”assemble.xml”的文件名。

  • 我在您的查询中没有看到任何尝试按不同值分组的内容。你能更清楚你想要什么吗?
  • 通常,您需要使用 XQuery 3.0 group by 表达式,或者,如果您使用的是旧版本的语言,则需要使用 distinct-values() 过滤器。
  • …但目前,我真的不明白你的期望。拥有如此庞大的文档以致难以阅读也无济于事——如果您可以使用 3-4 行 XML 文件和相当缩短的代码重现该问题,那将很有帮助,并且符合 stackoverflow .com/help/mcve
  • …顺便说一句,docs.basex.org/wiki/XQuery_3.0#Group_By 是 XQuery 3.0 语法的一个很好的参考,并且 StackOverflow 上已经有很多问题和答案显示了旧版本的 distinct-values() 模式语言的;一个是stackoverflow.com/questions/23745868/grouping-in-xquery
  • 很抱歉编辑帖子后的错误解释,我快结束工作时间了,需要跑到班车上,所以我忘了编辑主题和我的期望。


1
2
3
4
5
6
7
8
9
10
11
12
<chapters>{
let $doc := doc(“assemble.xml”)
for $chapter in $doc/user_manual/embed-language_part/language_part/embed-user_manual_part/user_manual_part/embed-chapter/chapter
return
    <chapter>
    title:{data($chapter/embed-title_module/title_module/title)}
        {
            for $section in $chapter/embed-section/section
                return <section>title: {data($section/embed-title_module/title_module/title)}</section>
        }
    </chapter>
}</chapters>


我在互联网上搜索,我发现了如何进行内循环操作。下面的代码完全符合我的期望。

  • 我在此代码中的任何地方都看不到 group-by 操作(使用直接的 XQuery 3.0 语法或任何有效的解决方法,因为在以前的版本中缺乏相同的方法),这让我对您的问题的实际含义更加好奇。
  • 让我这样解释,首先我只是因为我将按他们的 ID 对数据进行分组,但之后我认识到这对我来说不是必需的,所以我编辑了我的问题,然后我解释了我实际需要的内容。我的第一种方法是错误的,如果您在我的编辑后仔细阅读,您会发现我删除了关于分组的行。我提到了如何同时控制外循环和内循环……


来源:https://www.codenong.com/26482675/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9741.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?