如何重命名Oracle XMLTYPE节点

前端之家收集整理的这篇文章主要介绍了如何重命名Oracle XMLTYPE节点前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在PL / sql中有一个 XMLType,我需要重命名一些节点和一些值.例如:

<root>
   <fields>
        <a>foo</a>
        <b>bar</b>
   </fields>
</root>

我想把上面的内容变成这样:

<root>
   <fields>
        <a>foo</a>
        <c>baz</c>
   </fields>
</root>

我知道我可以像这样更新值:

SELECT UpdateXML(my_xml,'/root/fields/b/text()','baz')
  INTO my_xml_updated
  FROM DUAL;

结果是:

<root>
   <fields>
        <a>foo</a>
        <b>baz</b>
   </fields>
</root>

但是如何从< b>更新节点名称?到< c> (不影响节点的内容)?

解决方法

一种选择是使用 XMLTRANSFORM重命名节点.另见例如 Rename nodes with XSLT.

with
xmldata as (select xmltype('<root>
  <fields>
    <a>foo</a>
    <b>bar</b>
  </fields>
</root>') val from dual),stylesheet as (select '<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- Identity transformation -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  <!-- Identity transformation overridden for element b -->
  <xsl:template match="b">
    <xsl:element name="c">
      <xsl:apply-templates select="node()|@*"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>' val from dual)
select xmltransform(x.val,s.val) from xmldata x,stylesheet s;

输出

XMLTRANSFORM(X.VAL,S.VAL)
--------------------------------------------------------------------------------
<root>
  <fields>
    <a>foo</a>
    <c>bar</c>
  </fields>
</root>

猜你在找的Oracle相关文章