【问题标题】:XMLTYPE update replacing values in last tag in Oracle 12cXMLTYPE 更新替换 Oracle 12c 中最后一个标记中的值
【发布时间】:2017-02-01 14:58:16
【问题描述】:

我有一个带有 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>

谢谢

【问题讨论】:

    标签: oracle12c xmltype


    【解决方案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>
    

    【讨论】:

    • 2000分给你!!谢谢。我无法获得“测试”节点的数量。没有它,我就无法继续逻辑......谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多