2011-10-17 2 views
4

J'ai un XMLType en PL/SQL et j'ai besoin de renommer certains des noeuds et certaines des valeurs. Par exemple:Comment renommer un noeud Oracle XMLTYPE

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

Je veux tourner de ce qui précède ceci:

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

Je sais que je peux mettre à jour la valeur comme ceci:

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

Le résultat est:

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

Mais comment puis-je mettre à jour le nom de noeud de <b> à <c> (sans affecter le contenu du noeud)?

+1

Votre lien pointe vers une documentation de _Berkeley DB_, pas vers _Oracle DB_. – user272735

+0

Merci, j'ai supprimé cet aspect de la question car il était redondant. – wweicker

Répondre

3

Une option consiste à utiliser XMLTRANSFORM pour renommer un noeud. Voir aussi par ex. 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; 

Sortie:

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

Ceci supprime le contenu de 'c' mais peut être modifié comme ceci: wweicker

+0

@wweicker: Oui c'est le cas, mais maintenant la réponse est mise à jour pour répondre aux nouvelles exigences :) – user272735

0

Ou, vous pouvez définir une feuille de style XSL qui fera le changement et utiliser dbms_xslprocessor pour faire vos modifications.

Questions connexes