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

XMLTYPE update replacing values in last tag in Oracle 12c

我有一个包含 3 个同名标记元素的 XMLTYPE。我想替换';'带有“.”在最后一个。像这样:

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>

谢谢

目前您正在修改所有 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>