我需要选择具有不同名称属性值的节点,仅考虑第一个字符。
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的新手,无法构建工作声明。
感谢您的帮助
答案 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]