首页 > 解决方案 > XPath/XQuery:计算节点元素并返回带有父 ID 的最小计数

问题描述

我将举一个例子来更好地澄清自己。

例子:

<asdf>
    <parentnode id ="1">
           <childnode>
            ...
            </childnode>
            <childnode>
            ...
            </childnode>
    </parentnode>
    <parentnode id ="2">
            <childnode>
            ...
            </childnode>
            <childnode>
            ...
            </childnode>
            <childnode>
            ...
            </childnode>
    </parentnode>
    <parentnode id ="3">
            <childnode>
            ...
            </childnode>
    </parentnode>
</asdf>

我需要计算所有父节点的所有子节点,并返回给定父节点的子节点的最小数量及其 id。

对于此示例,解决方案将是:

<parentnode id="3" amount="1"/>

我真的不知道从哪里开始。我是否必须在 for 循环中计算不同的元素,或者这也可以使用 Xpath 表达式?我不确定这是否是正确的方向:

let $a := fn:doc('asdf.xml')/asdf/*
 return 
for $z in distinct-values($a/name() = childnode )
 order by count($z) ascending
 return $z)[1]

标签: xmlxpathxsdxquery

解决方案


  • 按 的对这些parentnode元素进行排序count()childnode
  • childnode从该排序序列中,选择第一个,这是元素数量最少的序列
  • 然后使用元素的计算元素构造函数构造一个元素,复制它的任何属性,然后使用计算属性构造函数创建属性,为其分配元素的值name()$least-children@amountcount()childnode

.

let $least-children := 
  (for $parent in $a
   order by count($parent/childnode) ascending
   return $parent)[1]

return
  element {$least-children/name()} { 
    $least-children/@*, 
    attribute {"amount"} { count($least-children/childnode)} 
  }

推荐阅读