我在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>
解决方法
一种选择是使用
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>