xQuery 1.0,元素计数

时间:2015-05-15 19:05:02

标签: count xquery sections

我在编写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>))

此外,我不知道如何将章节的标题放在标有***的地方。

1 个答案:

答案 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:注意我没有测试代码。