oracle-databasexpathxmltypexmltableoracle-xml-db

Oracle XMLTable- fetching column from parent node


I have the following XML structure:

<root>
    <parent>
         <parent_id>1</parent_id>
         <parent_value>10000</parent_value>
         <child>
              <child_id>11</child_id>
              <other_value>1000</other_value>
         </child>
         <child>
              <child_id>12</child_id>
              <other_value>1000</other_value>
         </child>
    </parent>
</root>

Expected Output:

  CHILD_ID PARENT_VALUE
---------- ------------
        11 10000            
        12 10000            

What I have tried:

WITH xtbl AS (SELECT xmltype ('<root>
                    <parent>
                         <parent_id>1</parent_id>
                         <parent_value>10000</parent_value>
                         <child>
                              <child_id>11</child_id>
                              <other_value>1000</other_value>
                         </child>
                         <child>
                              <child_id>12</child_id>
                              <other_value>1000</other_value>
                         </child>
                    </parent>
                </root>') AS xcol FROM dual)
      SELECT myXmlTable.*
        FROM xtbl
             CROSS JOIN
             xmltable ('/root/parent/child'
                       PASSING xcol
                       COLUMNS child_id NUMBER (5) PATH 'child_id',
                               parent_value NUMBER (10) PATH './parent_value') myXmlTable;

Problem with my query is that parent_value comes to be null. Please help.


Solution

  • You are looking for ./parent_node, which is a <parent_node> under the current <child> node. And that doesn't exist.

    You just need to go up a level:

    parent_value NUMBER (10) PATH './../parent_value'
    

    Demo with your CTE and just that added ../:

    WITH xtbl AS (SELECT xmltype ('<root>
                        <parent>
                             <parent_id>1</parent_id>
                             <parent_value>10000</parent_value>
                             <child>
                                  <child_id>11</child_id>
                                  <other_value>1000</other_value>
                             </child>
                             <child>
                                  <child_id>12</child_id>
                                  <other_value>1000</other_value>
                             </child>
                        </parent>
                    </root>') AS xcol FROM dual)
          SELECT myXmlTable.*
            FROM xtbl
                 CROSS JOIN
                 xmltable ('/root/parent/child'
                           PASSING xcol
                           COLUMNS child_id NUMBER (5) PATH 'child_id',
                                   parent_value NUMBER (10) PATH './../parent_value') myXmlTable;
    
      CHILD_ID PARENT_VALUE
    ---------- ------------
            11        10000
            12        10000