使用xquery从xmltable获取所有属性

使用xquery从xmltable获取所有属性,xml,oracle,xquery,Xml,Oracle,Xquery,我有一个xml表,其中每个项都有很多属性 比如说, DIG_POINT LowValue="2" StatusText1="LIG 21" StatusText2="LIG 22" StatusText3="LIG 23" 我看到的所有示例都必须引用列名称 SELECT xmlkey , x.* FROM xmlimport t, XMLTABLE ('/SRDBSW/DIG_POINT[@LowValue="2"]' PASSING t.XMLDATA COL

我有一个xml表,其中每个项都有很多属性

比如说,

DIG_POINT LowValue="2" StatusText1="LIG 21" StatusText2="LIG 22" StatusText3="LIG 23"
我看到的所有示例都必须引用列名称

 SELECT xmlkey , x.*
     FROM xmlimport t,
          XMLTABLE ('/SRDBSW/DIG_POINT[@LowValue="2"]' PASSING t.XMLDATA COLUMNS StatusText1 VARCHAR2(30) PATH '@StatusText1') x
    WHERE xmlkey = 'TEST';
我的问题是属性名称可能会动态添加


是否有一种方法可以获取类似“select*from…”的内容,其中可以从每个项目获取所有属性?

您可以使用XPath提取属性,并将每个属性转换为虚拟元素中的名称/值对:

SELECT t.xmlkey, x.*
FROM xmlimport t
CROSS JOIN XMLTABLE ('for $i in /SRDBSW/DIG_POINT[@LowValue="2"], $j in $i/@*
  return element tmp { attribute name {local-name($j)}, attribute value {$j} }'
  PASSING t.XMLDATA
  COLUMNS
    attr_name VARCHAR2(30) PATH '/tmp/@name',
    attr_value VARCHAR2(30) PATH '/tmp/@value'
) x
WHERE t.xmlkey = 'TEST';

XMLK ATTR_NAME                      ATTR_VALUE                   
---- ------------------------------ ------------------------------
TEST LowValue                       2                             
TEST StatusText1                    LIG 21                        
TEST StatusText2                    LIG 22                        
TEST StatusText3                    LIG 23                        
for$i in…
获取所有匹配的节点,就像您已经做的那样;然后在该
中,$i/@*
中的$j获取该节点的所有属性。
元素
构造一个新节点,
属性
子句将属性名称(来自
local-name()
)和实际属性值转换为该虚拟元素中单独的命名属性。然后,
路径
可以引用虚拟元素中的已知属性名称

实际上,您不需要同时使用
$i
$j
,它只是更清楚地显示了正在发生的事情;如果愿意,可以使用如下XPath:

'for $i in /SRDBSW/DIG_POINT[@LowValue="2"]/@*
  return element tmp { attribute name {local-name($i)}, attribute value {$i} }'
或者更简单,将
local-name()
查找移动到
路径中

SELECT t.xmlkey, x.*
FROM xmlimport t
CROSS JOIN XMLTABLE ('/SRDBSW/DIG_POINT[@LowValue="2"]/@*'
  PASSING t.XMLDATA
  COLUMNS
    attr_name VARCHAR2(30) PATH 'local-name(.)',
    attr_value VARCHAR2(30) PATH '.'
) x
WHERE t.xmlkey = 'TEST';

XMLK ATTR_NAME                      ATTR_VALUE                   
---- ------------------------------ ------------------------------
TEST LowValue                       2                             
TEST StatusText1                    LIG 21                        
TEST StatusText2                    LIG 22                        
TEST StatusText3                    LIG 23                        

非常感谢,谢谢,你让我只问一个问题,因为我有很多不同的“项目”liike DIG_POINT,如果节点-->“项目”?@AntónioRoque:别忘了接受最能回答你问题的答案。获得的声誉积分激励人们继续回答问题。祝大家好运。怎么样。。。对不起,我是怎么做到的?@AntónioRoque-你怎么做什么-接受回答?单击它旁边的绿色勾号。(请参阅)。