Localizar nodo em XML sem saber seu path

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Pessoal, estou em um dilema, em uma rotina PL/SQL eu sei que preciso localizar o nodo <nomeP> em um XML, porém como o XML pode alterar (na verdade eles serão XML´s diferentes e todos eles terão o nodo <nomeP> em diferentes posições).

Existe uma forma ou comando PL/SQL que eu indique o XML e o nodo e ele me retorne seu path?

Vlw.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Talvez essa query possa ajudar:

Selecionar tudo

with xslt as (
  select '<?xml version="1.0" ?><xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
  <records>
    <xsl:apply-templates/>
   </records>
  </xsl:template>
  <xsl:template match="//name">
      <columns>
        <path>
        <xsl:for-each select="ancestor-or-self::*">
            <xsl:call-template name="print-step"/>
        </xsl:for-each>
        </path>
  <value>
    <xsl:value-of select="."/>
  </value>
        <xsl:apply-templates select="*"/>
      </columns>
    </xsl:template>
    <xsl:template name="print-step">
        <xsl:text>/</xsl:text>
        <xsl:value-of select="name()"/>
        <xsl:text>[</xsl:text>
        <xsl:value-of select="1+count(preceding-sibling::*)"/>
        <xsl:text>]</xsl:text>
    </xsl:template>
   </xsl:stylesheet>'
  xsl from dual)
, xmldata as
(select xmltransform(xmltype('<?xml version="1.0"?>
    <users><user><name>user1</name></user>
           <user><name>user2</name></user>
           <group>
              <user><name>user3</name></user>
           </group>
           <user><name>user4</name></user>
    </users>'), xmltype(xsl)) xd from xslt)

select  XT.* 
from xmldata c,
xmltable('$x//columns' passing c.xd
   as "x"
         columns
         path_c VARCHAR2(4000) PATH 'path',
         value_c VARCHAR2(4000) PATH 'value'
        ) as XT 
Saída:

Selecionar tudo

PATH_C                                        VALUE_C
--------------------------------------------- ---------------------
/users[1]/user[1]/name[1]                     user1
/users[1]/user[2]/name[1]                     user2
/users[1]/group[3]/user[1]/name[1]            user3
/users[1]/user[4]/name[1]                     user4

SQL>         
Fonte: http://stackoverflow.com/questions/1589 ... 6#15899456
Responder
  • Informação