使用xquery从xmltable获取所有属性
我有一个xml表,其中每个项都有很多属性 比如说,使用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
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-你怎么做什么-接受回答?单击它旁边的绿色勾号。(请参阅)。