我在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>
(不影响节点内容)?
答案 0 :(得分:3)
一种选择是使用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>
答案 1 :(得分:0)
或者,您可以定义一个xsl样式表来进行更改并使用dbms_xslprocessor进行修改。