2015-04-28 44 views
0

我的以下查询效果很好,但我似乎无法获得选项节点上的内部文本以适应我的生活。我如何获得要求,收到,存档或拒绝以便在表格中显示?我尝试过使用$ i/text(),$ i /。等。想法?Oracle XPath:获取内部文本

select 
    x."LABEL", 
    x."NAME", 
    x."THE_VAL" 
FROM 
    XMLTABLE(
    'for $i in /metadata/fields/field/option 
     return element r{ 
     $i/@value, 
     $i/../@label, 
     $i/../@name 
     }' 
     PASSING xmltype(
    '<metadata> 
    <fields> 
    <field name="cusRc01" label="Capillary Pressure - MICP"> 
     <option value="1">Required</option> 
     <option value="2">Received</option> 
     <option value="3">Archived</option> 
     <option value="4">Rejected</option> 
     <option value="5">N/A</option> 
    </field> 
    <field name="cusRc02" label="Fluid Sensitivity"> 
     <option value="1">Required</option> 
     <option value="2">Received</option> 
     <option value="3">Archived</option> 
     <option value="4">Rejected</option> 
     <option value="5">N/A</option> 
    </field> 
    </fields> 
    </metadata>') 
     COLUMNS 
     --val_label VARCHAR(32) PATH 'option', 
     the_val INTEGER PATH '@value', 
     name VARCHAR(32) PATH '@name', 
     label VARCHAR(32) PATH '@label') x; 

回答

1

您可以打开option元素含量(与text()获得)到您的r元素的属性:

select 
    x."VAL_LABEL", 
    x."LABEL", 
    x."NAME", 
    x."THE_VAL" 
FROM 
    XMLTABLE(
    'for $i in /metadata/fields/field/option 
     return element r{ 
     attribute val_label {$i/text()}, 
     $i/@value, 
     $i/../@label, 
     $i/../@name 
     }' 
     PASSING xmltype(
    '<metadata> 
... 
    </metadata>') 
     COLUMNS 
     val_label VARCHAR(32) PATH '@val_label', 
     the_val INTEGER PATH '@value', 
     name VARCHAR(32) PATH '@name', 
     label VARCHAR(32) PATH '@label') x; 

它得到:

VAL_LABEL      LABEL       NAME        THE_VAL 
-------------------------------- -------------------------------- -------------------------------- ---------- 
Required       Capillary Pressure - MICP  cusRc01         1 
Received       Capillary Pressure - MICP  cusRc01         2 
Archived       Capillary Pressure - MICP  cusRc01         3 
Rejected       Capillary Pressure - MICP  cusRc01         4 
N/A        Capillary Pressure - MICP  cusRc01         5 
Required       Fluid Sensitivity    cusRc02         1 
Received       Fluid Sensitivity    cusRc02         2 
Archived       Fluid Sensitivity    cusRc02         3 
Rejected       Fluid Sensitivity    cusRc02         4 
N/A        Fluid Sensitivity    cusRc02         5 

10 rows selected 

你也可以包括节点作为最后部分元素:

'for $i in /metadata/fields/field/option 
     return element r{ 
     $i/@value, 
     $i/../@label, 
     $i/../@name, 
     $i/node() 
     }' 

...然后使用@ gmiley的点符号:

 COLUMNS 
     val_label VARCHAR(32) PATH '.', 
     the_val INTEGER PATH '@value', 
     name VARCHAR(32) PATH '@name', 
     label VARCHAR(32) PATH '@label') x; 

...可以得到相同的输出。请注意,在所有属性之后,节点必须是元素调用中的最后一件事。

-1

尝试改变最后一位为您列定义是:

COLUMNS 
    val_label VARCHAR(32) PATH '.', 
    the_val INTEGER PATH '@value', 
    name VARCHAR(32) PATH '@name', 
    label VARCHAR(32) PATH '@label') x; 

您已经选择option所以你会选择option/option你以前有它的方式。

+0

嗯,这似乎并不奏效。 –

+0

@slothario - 你需要''元素r''构造函数来提供选项节点的文本;使用''。''路径可以将其作为元素内容而不是属性。 (我更新了我的答案,演示了这种方法)。 –