2015-04-28 79 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''構造函數來提供選項節點的文本;使用''。''路徑可以將其作爲元素內容而不是屬性。 (我更新了我的答案,演示了這種方法)。 –