我正在尝试编写一个查询,它将xml形成一个数据库,并在找到某个字符时翻转两个属性值。例如:
<people>
<person name="Alice" age="20" team="developer" dep="red" version="old" />
<person name="Sam" age="23" team="marketing" dep="blue" version="old" />
<person name="Bob" age="21" team="sales" dep="green" version="new" />
</people>
如果version="old"
,那么我想翻转团队和颜色属性。所以爱丽丝会:
<person name="Alice" age="20" team="red" dep="developer" version="new" />
我让数据库返回只有“old”的行,但我不知道如何替换属性。
UPDATE mDB
SET people.modify('
for $p in (/people/person)
let $team := $p/@team
let $dep := $p/@dep
replace value of node
$p/@dep
with
$team
replace value of node
$p/@team
with
$dep
')
FROM mDB
WHERE people.exist('
for $p in (/people/person)
where contains( data( $p/@version ), "old" )
return data( $person/@version)') != 0
答案 0 :(得分:0)
我不知道你的SQL / XQuery混合是使用XQuery的本机更新功能还是来自你的sql供应商,但是快速查看文档应该告诉你。
您目前告诉XQuery更新节点的值,您希望更新属性的值,即如果将$p/@dep
替换为$p/@team
,结果将只是{ {1}}和@dep
在输出中切换顺序。 @team
将成为<person team='x' dep='1'/>
您需要按原样保留节点,但只能替换属性的值。像这样:
<person dep='1' team='x'/>
将产生所需的输出:
for $p in people/person[@version = "old"]
return
element person {
attribute name {data($p/@name)},
attribute age {data($p/@age)},
attribute team {data($p/@dep)}, (: <- note the switch :)
attribute dep {data($p/@team)}, (: <- s.a. :)
attribute version {data($p/@version)}
}