XMLTYPE更新替换Oracle 12c中最后一个标记中的值

时间:2017-02-01 14:58:16

标签: oracle12c xmltype

我有一个XMLTYPE,其中包含3个同名的标记元素。我想替换';'用'。'在最后一个。像这样:

SELECT XMLQUERY (
          'copy $tmp := . modify
            (for $i in $tmp/root/test/text()  
             return replace value of node $i
                    with ''.'') 
            return $tmp'
          PASSING XMLTYPE (
                     '<root><test>asdasdsada;</test><test>lkjasdhalskdjhlakjsdh;</test><test>tirari;</test></root>')
          RETURNING CONTENT)
  FROM DUAL

我的结果应该是这样的;

<root><test>asdasdsada;</test><test>lkjasdhalskdjhlakjsdh;</test><test>tirari.</test></root>

由于

1 个答案:

答案 0 :(得分:1)

目前您正在修改所有test个节点,而您正在用句点完全替换内容。根据您的预期输出而不是您想要的。

您可以将test个节点的数量计入变量,然后使用[postition()=$n]仅将替换应用于最终节点。然后,您可以使用replace()translate()功能仅将;更改为.,而不是替换节点的整个文本内容:

SELECT XMLQUERY (
          'copy $tmp := . modify
            (let $n := count($tmp/root/test)
            for $i in $tmp/root/test[position()=$n]/text()  
             return replace value of node $i with replace($i, ";", "."))
            return $tmp'
          PASSING XMLTYPE (
                     '<root><test>asdasdsada;</test><test>lkjasdhalskdjhlakjsdh;</test><test>tirari;</test></root>')
          RETURNING CONTENT) AS RESULT
  FROM DUAL;

RESULT                                                                                                                  
------------------------------------------------------------------------------------------------------------------------
<root><test>asdasdsada;</test><test>lkjasdhalskdjhlakjsdh;</test><test>tirari.</test></root>