XQuery(DB2)替换节点(如果存在)。可能吗?

时间:2011-07-02 14:04:31

标签: db2 xquery

请参阅以下查询:

select
  xmlquery
  (
    '
      if ($xml/foo/bar) then
        transform copy $xml := $xml modify do replace $xml/foo/bar with <bar>some stuff</bar> return $xml
      else
        $xml
    '
    passing xmlparse(document '<foo><bar>something here</bar></foo>') as "xml"
  )
from sysibm.sysdummy1

这个查询工作正常:它取代了/ foo / bar节点,我非常高兴。如果/ foo / bar节点不存在,我只是不想发生任何事情。因此,以下查询应该只返回未修改的XML:

select
  xmlquery
  (
    '
      if ($xml/foo/bar) then
        transform copy $xml := $xml 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

嗯......所以我想。事实上,DB2愉快地告诉我:

  

SQL16085N XQuery“replace”表达式的目标节点无效。

也许我对if if think的语法错了,并且在上面的两个查询中都执行了“then”-part。所以我尝试交换then和else,因为很明显DB2不应该尝试执行then和else部分。但这根本没有改变任何东西。

现在我显然很困惑。是不是可以做我喜欢用XPath做的事情,因为无论它们是否被执行都必须满足所有路径表达式?或者我只是做错了什么?

2 个答案:

答案 0 :(得分:1)

我有类似的问题,我解决了这个问题:

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

这似乎是一个错误

答案 1 :(得分:0)

并且你不会使用任何类型的函数“exists(....)”例如fn:exists(item1,item2 ...)其中如果参数的值不是空的,则exists函数返回true序列,否则返回false? 当然,我对db2一无所知:)。