XQuery(DB2)替换节点(如果存在)。有可能吗?
请参见以下查询:XQuery(DB2)替换节点(如果存在)。有可能吗?,db2,xquery,Db2,Xquery,请参见以下查询: 选择 xmlquery ( ' 如果($xml/foo/bar),那么 transform copy$xml:=$xml modify do用一些东西替换$xml/foo/bar返回$xml 其他的 $xml ' 将xmlparse(文档“此处某物”)作为“xml”传递 ) 来自sysibm.sysdummy1 这个查询工作得很好:它替换了/foo/bar节点,我非常高兴。如果/foo/bar节点不存在,我只希望什么也不发生。因此,以下查询应该只返回未修改的XML: 选择 x
选择
xmlquery
(
'
如果($xml/foo/bar),那么
transform copy$xml:=$xml modify do用一些东西替换$xml/foo/bar返回$xml
其他的
$xml
'
将xmlparse(文档“此处某物”)作为“xml”传递
)
来自sysibm.sysdummy1
这个查询工作得很好:它替换了/foo/bar节点,我非常高兴。如果/foo/bar节点不存在,我只希望什么也不发生。因此,以下查询应该只返回未修改的XML:
选择
xmlquery
(
'
如果($xml/foo/bar),那么
transform copy$xml:=$xml modify do用一些东西替换$xml/foo/bar返回$xml
其他的
$xml
'
将xmlparse(文档“此处无任何内容”)作为“xml”传递
)
来自sysibm.sysdummy1
嗯。。。所以我想。事实上,DB2很高兴地告诉我:
SQL16085N XQuery“替换”表达式的目标节点无效
也许我对if-think和“then”-部分的语法有误,这两个部分都是在上面的两个查询中执行的。所以我尝试交换then和else,因为显然DB2不应该尝试执行then和else部分。但这丝毫没有改变任何事情
现在我显然感到困惑。难道不能像我喜欢的那样使用XPath吗,因为无论是否执行,所有路径表达式都必须满足要求?或者我只是做错了什么?并且您是否使用了任何类型的函数“exists(..)”例如fn:exists(item1,item2…),其中exists函数在参数值不是空序列时返回true,否则返回false?
假设我对db2一无所知:)我也遇到了类似的问题,所以我解决了这个问题:
select
xmlquery('
let $xml0 := <xml><foo><bar/></foo></xml> return
if ($xml/foo/bar) then
transform copy $xml := ($xml[foo/bar], $xml0)[1] modify
do replace $xml/foo/bar with <bar>some stuff</bar>
return $xml
else
$xml
' passing xmlparse(document '<foo>nothing here</foo>') as "xml")
from sysibm.sysdummy1
选择
xmlquery('
让$xml0:=返回
如果($xml/foo/bar),那么
转换副本$xml:=($xml[foo/bar],$xml0)[1]修改
一定要用一些东西替换$xml/foo/bar
返回$xml
其他的
$xml
'将xmlparse(文档“此处无任何内容”)传递为“xml”)
来自sysibm.sysdummy1
这似乎是一个bug存在的不是问题。如果($xml/foo/bar)工作得很好,就我所能看到的而言,它做了我希望它做的事情。问题出在替换上。即使没有执行,它也会失败