XQuery - 选择具有不同属性子串的节点

时间:2016-07-10 12:20:46

标签: xquery

我需要选择具有不同名称属性值的节点,仅考虑第一个字符。

XML

<A>
    <B name="X_01"/>
    <B name="X_02"/>
    <B name="Y_01"/>
    <B name="X_03"/>
    <B name="Z_01"/>
    <B name="Y_02"/>
</A>

期望的输出

<B name="X_01"/>
<B name="Y_01"/>
<B name="Z_01"/>

它不一定是名字属性中第一次出现B且具有不同的第一个字符值。

我是XQuery的新手,无法构建工作声明。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

xquery version "1.0";

let $xml := <A>
<B name="X_01"/>
<B name="X_02"/>
<B name="Y_01"/>
<B name="X_03"/>
<B name="Z_01"/>
<B name="Y_02"/>
</A>

let $distinct-values := fn:distinct-values(
    for $attr in $xml/B/@name
    return fn:substring($attr,1,1)
  )

return for $prefix in $distinct-values
  return $xml/B[fn:starts-with(@name, $prefix)][1]

答案 1 :(得分:1)

Slightly simpler implementation using the group by clause thusly:

let $stuff := <A>
    <B name="X_01"/>
    <B name="X_02"/>
    <B name="Y_01"/>
    <B name="X_03"/>
    <B name="Z_01"/>
    <B name="Y_02"/>
</A>
return 
  for $b in $stuff/B
  group by $val := substring($b/@name, 1, 1)
  return $b[1]