Oracle XPath:获取内部文本

时间:2015-04-28 17:23:06

标签: xml oracle xpath

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

-r

2 个答案:

答案 0 :(得分: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 :(得分:-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之前的方式。