2011-10-17 57 views
4

我在PL/SQL中有一個XMLType,我需要重命名一些節點和一些值。例如:如何重命名Oracle 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>(不影響節點內容)?

+1

您的鏈接指向_Berkeley DB_的文檔,而不是_Oracle DB_。 – user272735

+0

謝謝,我刪除了這個問題的方面,因爲它是多餘的。 – wweicker

回答

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> 
+0

這會丟棄'c'的內容,但可以這樣修改: wweicker

+0

@wweicker:是的,但現在答案已更新以符合更改的要求:) – user272735

0

或者,你可以定義一個XSL樣式表,將做出改變,並使用dbms_xslprocessor做你的修改。