2011-10-17 8 views
4

私はPL/SQLでXMLTypeを使用しているため、ノードの一部と値の一部の名前を変更する必要があります。たとえば:Oracle XMLTYPEノードの名前を変更する方法

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

私はこれに上記オンにする:

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

結果は次のとおりです:

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

は私がこのような値を更新することができます知っています

<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

それとも、あなたが変更を行うと、あなたの修正を行うためにDBMS_XSLPROCESSORを使用するXSLスタイルシートを定義することができます。

関連する問題