2011-07-02 54 views
0

請參見下面的查詢:如果XQuery(DB2)存在,則替換節點。有可能嗎?

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節點不存在,我只想要不發生任何事情。所以下面的查詢應該只返回未修改的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「替換」表達式的目標節點無效。

也許我錯了關於如果我認爲和「then」-part在上面的兩個查詢中都執行的語法。所以我試圖交換then和else,因爲顯然DB2不應該嘗試執行then和else兩個部分。但這並沒有改變任何事情。

現在我很清楚困惑。是不是可以做我喜歡用XPath做的事情,因爲所有的路徑表達式都必須滿足它們是否被執行?或者我只是做錯了什麼?

+0

可能對你有意思 - 所有DB2 XML HTTP可能性://amolnpujari.wordpress.com/2008/04/12/db2-native-xml/ –

回答

0

並且您不使用任何類型的函數「exists(....)」例如fn:exists(item1,item2 ...)其中exists函數返回true,如果參數的值不是空序列,否則返回false? 誠然,我什麼都不知道DB2 :)

+0

存在不是問題。如果($ xml/foo/bar)工作的很好,並且據我所見,它可以做我想做的事情。替換是問題。即使未執行,它也會失敗。 – yankee

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 

這似乎是一個錯誤