【发布时间】:2014-10-21 08:56:11
【问题描述】:
我有一个示例 xml 文件,例如:
<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">
<embed-language_part id="SL14686180">
<language_part id="ecls_bio_becls_a3_a14686169.SL9761756.7" role="-" lang="de">
<embed-user_manual_part id="ecls_bio_becls_a3_a14686169.SL14686446.10">
<?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">
<embed-chapter id="ecls_bio_becls_a3_a17144756.SL9762101.13">
<?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">
<embed-title_module id="ecls_bio_becls_a3_a30660983.SL2361816.15">
<?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>
</title_module>
<?ecls-end-embedded-resource resource="ecls_bio_becls_a3_a611713"?>
</embed-title_module>
<embed-section id="ecls_bio_becls_a3_a30660983.SL10400094.18">
<?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?>
<embed-title_module id="ecls_bio_becls_a3_a11752692.SL1742291.20">
<?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</title>
<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 文件中:
<chapter id="ecls_bio_becls_a3_a30660983.SL2300626.14" role="-" toctitle="yes" footrowtitle="no" type="security">
<embed-title_module id="ecls_bio_becls_a3_a30660983.SL2361816.15">
<?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>
...
在该示例中,Sicherheits-ind Warnhinweise 是章节元素的标题。章节可以有很多部分,在我们的示例部分的标题是:
<section id="ecls_bio_becls_a3_a11752692.SL1742298.19" footrowtitle="no" role="-" toctitle="yes">
<?Pub Caret1?>
<embed-title_module id="ecls_bio_becls_a3_a11752692.SL1742291.20">
<?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</title>
...
Bevor Sie das Gerat 在 Betrieb nehmen。
预期结构:
<chapter> title:"Chapter's title"
<section>title:"First section's title"</section>
<section>title:"Second section's title"</section>
</chapter>
对于该示例章节只有一个部分,但我只是配置了这一章以达到我的文件的解决方案,我猜这是最易读的配置......
我尝试了以下 xquery 查询:
<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>
有两个嵌套循环,但这段代码使我的结构如下:
<chapter>title:"Chapter's title"<section>"First section's title"</section></chapter>
<chapter>title:"Chapter's title"<section>"Second section's title"</section></chapter>
问题是循环的,但是当我尝试像这样编辑代码时:
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跨度>
-
...btw,docs.basex.org/wiki/XQuery_3.0#Group_By 是 XQuery 3.0 语法的一个很好的参考,并且 StackOverflow 上已经有 很多 的问题和答案显示了不同的值( ) 旧版本语言的模式;一个是stackoverflow.com/questions/23745868/grouping-in-xquery
-
对不起,编辑帖子后解释错误,我的工作时间快结束了,需要跑去班车,所以我忘了编辑主题和我的期望。