2

我正在尝试创建一个 XQuery 来生成与 no 一起使用的 xml 标记的以下详细信息。发生的

Book- 3 发生 Article-2 发生会议 - 1 发生

这可能吗?我一直在尝试,但它不起作用

<test>
   <book>
        <year>1992</year>
   ....
   </book>
   <article>
        <year>1992</year>
   ....
   </article>
   <conference>
        <year>1992</year>
   ....
   </conference>
   <article>
        <year>1992</year>
   ....
   </article>
   <book>
        <year>1992</year>
   ....
   </book>
   <book>
        <year>1992</year>
   ....
   </book>
</test>
4

3 回答 3

2

使用这个纯粹而简单的 XPath 2.0 表达式

for $name in distinct-values(/*/*/name())
 return
   ($name, count(index-of(/*/*/name(),$name)),'&#xA;')

当根据提供的 XML 文档评估此表达式时:

<test>
   <book>
        <year>1992</year>
   ....
   </book>
   <article>
        <year>1992</year>
   ....
   </article>
   <conference>
        <year>1992</year>
   ....
   </conference>
   <article>
        <year>1992</year>
   ....
   </article>
   <book>
        <year>1992</year>
   ....
   </book>
   <book>
        <year>1992</year>
   ....
   </book>
</test>

产生了想要的正确结果:

 book 3
 article 2 
 conference 1 
于 2013-03-21T03:51:24.767 回答
1

group by如果您正在使用的 XQuery 不支持该语法,那么下面的方法应该可以工作:

for $dn in distinct-values(for $x in (/test/*) 
                           return local-name($x))
let $count := count(/test/*[local-name() = $dn])
order by $count descending
return ($dn, "-", $count, "occurrence(s) ")

结果是:

book - 3 occurrence(s) article - 2 occurrence(s) conference - 1 occurrence(s)
于 2013-03-20T15:21:06.700 回答
0

据我了解。这是一个“XQuery 3”解决方案:

for $x in (/test/*) 
    let $eltName := local-name($x)
    group by $eltName 
return ($eltName, "-",count($x), "occurrence(s) /")

对于提供的 XML,结果是:

conference - 1 occurrence(s) / book - 3 occurrence(s) / article - 2 occurrence(s) /
于 2013-03-20T14:57:05.093 回答