对于以下xml
<Root>
<A><B>....</B></A>
<A><B>....</B><X>...</X></A>
我在SQL Server 2008R2中使用以下xquery。如何获取A
没有孩子X
的元素?
select @xml.query('<r>...
{ for $a in //A return
<a>... {... $a[????] ...} .... (: use $a which doesn''t have child X only :)
{ for $x in $a/X return <x>... $x ...</x> } (: otherwise use //a/x :)
</a>
}</r>')
更新 可测试的例子:
declare @xml xml = '
<Root>
<A><B>123</B><C>***</C></A>
<A><B>456</B><C>***</C><X>abc</X></A>
</Root>'
select @xml.query('<r>
{ for $a in //A return
<a>{ $a/B/text() } (: use $a which doesn''t have child X only :)
{ for $x in $a/X return $x/text() } (: otherwise use //a/x :)
</a>
}</r>')
预期<r><a>123</a><a>abc</a></r>
而不是<r><a>123</a><a>456abc</a></r>
。
答案 0 :(得分:1)
declare @xml xml = '
<Root>
<A><B>123</B></A>
<A><B>456</B><X>abc</X></A>
</Root>'
select @xml.query('
<r>{
for $a in //A
return <a>{
if (count($a/X) = 0)
then $a/*/text()
else $a/X/text()
}</a>
}</r>
')
答案 1 :(得分:0)
for $a in //A return
element { node-name($a) } {
$a/*[local-name(.) != 'X']
}
动态重建元素名称不是必需的,但假设这是一个简化的示例,如果您在迭代不同的元素名称,它可能会派上用场。