XQuery / XPath:如何计算不同元素中特定值的出现次数?

时间:2016-11-09 12:17:57

标签: xml xpath xquery

我正在尝试编写一个查询,该查询返回哪个作者/编辑器在两个单独的元素中发生的最多(“redaktør”(编辑)和“forfatter”(作者))。例如。下面我从我的XML中包含了两个bok-elements。作者西蒙格雷两次出现,一次是作者,一次是编辑,而迈克尔·布伦戴奇只出现一次(作为作者)。从这个XML中,结果应该是Simon Gray。

到目前为止,我有以下查询:

let $xml := doc('../Fagboker.xml')
return
(
   for $name in ($xml//forfatter)
   order by count($xml//forfatter[. = $name]) descending
   return 
        <x>{$name}</x>
 )[1]

这只会返回作者发生的最多。我需要将其扩展到计算编辑器。我尝试过诸如以下的查询:

let $xml := doc('../Fagboker.xml')
return
(
for $name in ($xml//forfatter)
    order by count($xml[. = $name] and $xml/*[parent::bok[child::redaktør]]) descending
return <x>{$name}</x>
)[1]

无济于事。我需要完全重写这个,还是有办法包含“redaktør”?

<fagbøker>
<bok isbn="9780321392794">
    <tittel>Data Structures in Java: From Abstract Data Types to the Java Collections
        Framework</tittel>
    <forfatter>
        <fornavn>Simon</fornavn>
        <etternavn>Gray</etternavn>
    </forfatter>
    <utgivelsesår>2006</utgivelsesår>

    <utgavenr>1</utgavenr>
    <fagfelt>
        <felt>Programmering</felt>
    </fagfelt>
    <referanser>
        <tittel/>
    </referanser>
    <forlag>Pearson</forlag>
    <TOC>
        <komponent>Part 1: Intro <komponent>Chapter 1: Hei <komponent>Subchapter 1 </komponent>
            </komponent>
        </komponent>
    </TOC>
</bok>

<bok isbn="0321165810">
    <tittel>XQuery: The XML Query Language</tittel>
    <forfatter>
        <fornavn>Brundage</fornavn>
        <etternavn>Michael</etternavn>
    </forfatter>
    <redaktør>
        <fornavn>Simon</fornavn>
        <etternavn>Gray</etternavn>
    </redaktør>
    <utgivelsesår>2004</utgivelsesår>
    <utgavenr>1</utgavenr>
    <fagfelt>
        <felt>XML</felt>
        <felt>Databaser</felt>
    </fagfelt>
    <referanser>
        <tittel/>
    </referanser>
    <forlag>Addison-Wesley Professional</forlag>
    <TOC>
        <komponent>Part 1: Intro <komponent>Chapter 1: Hei <komponent>XPath
                        <komponent> </komponent>
                </komponent>
            </komponent>
        </komponent>
    </TOC>
</bok>
</fagbøker>

1 个答案:

答案 0 :(得分:1)

您可以使用union(|)运算符在一个XPath中同时选择forfatterredaktør

let $xml := doc('../Fagboker.xml')
return
(
    for $name in distinct-values(/fagbøker/bok/*[self::forfatter|self::redaktør])
    let $count := count(/fagbøker/bok/*[self::forfatter|self::redaktør][. eq $name])
    order by $count descending
    return <x>{$name}</x>
)[1]

<强> demo