我在编写XQuery时遇到问题。我有这个XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<book>
<title>Data</title>
<author>Serge Abiteboul</author>
<author>Peter Buneman</author>
<author>Dan Suciu</author>
<section id="intro" difficulty="easy" >
<title>Chapter1</title>
<p>Text ... </p>
<section>
<title>SubChapter1</title>
<p>Text ... </p>
</section>
<section>
<title>SubChapter2</title>
<p>Text ... </p>
<figure height="400" width="400">
<title>Figure1</title>
<image source="csarch.gif"/>
</figure>
<p>Text ... </p>
</section>
</section>
<section id="syntax" difficulty="medium" >
<title>Chapter2</title>
<p>Text ... </p>
<figure height="200" width="500">
<title>Figure2</title>
<image source="graphs.gif"/>
</figure>
<p>Text ... </p>
<section>
<title>SubChapter3</title>
<p>Text ... </p>
</section>
<section>
<title>SubChapter6</title>
<p>Text ... </p>
<figure height="250" width="400">
<title>Figure3</title>
<image source="relations.gif"/>
</figure>
</section>
<section>
<title>SubChapter5</title>
<p>Text ... </p>
</section>
</section>
</book>
我必须编写一个Xquery,它将计算章节中的每个SubChapter,以及每个SubChapter中的每个数字。到目前为止我达到了这一点:
for $x in doc("file.xml")/book
return ((<main>{data($x/title)}</main>),
(<mChapter nrSubChapter="{count($x/section/title)}" nrFigure="{count($x/section/section/figure)}">{***data($x/section/title)***}</mChapter>),
(<mChapter nrSubChapter="{count($x/section/title}" nrFigures="{count($x//figure)}">{***data($x/section/title)***}</mChapter>))
此外,我不知道如何将章节的标题放在标有***的地方。
答案 0 :(得分:1)
我的示例查询中有几件我不理解的事情。首先,for $x in doc(...)/*
不会循环遍历多个节点,因为XML文档中有一个根元素(这是谎言,但为了简单起见,我们假装没有例外)。
您对括号的使用使得查询也很难阅读。为什么不在输出中使用更自然的XML结构?
你想要做的是从整本书(标题)中检索一些东西,然后循环遍历各个部分,然后为每个部分,循环遍历它自己的(子)部分。 / p>
let $book := doc('file.xml')/book
return
<result>
<main>{ xs:string($book/title) }</main>
{
for $section in $book/section
return
<chapter nrSubChapter="{ count($section/section) }"
nrFigure="{ count($section/figure) }">
<title>{ xs:string($section/title) }</title>
{
for $sub in $section/section
return
<section nrFigure="{ count($sub/figure) }">
<title>{ xs:string($sub/title) }</title>
</section>
}
</chapter>
}
</result>
如果你有几个级别的部分,你将不得不使用递归。
另外,正如Jens所说,你没有告诉我们你想要的确切输出格式,所以我只想告诉你如何解决这个问题,你必须根据你的精确要求进行调整。
PS:注意我没有测试代码。