我有以下自包含的测试用例:(通过Oracle www.example.com客户端在Oracle 12.1上运行11.2.0.3)
SET SERVEROUTPUT ON
DECLARE
xmldocX XMLType;
r1X VARCHAR2(100);
r2X VARCHAR2(100);
BEGIN
xmldocX:=XMLType('<xmlZdroj>
<zdrojdok typ="ELDP09">
<eldp09 xmlns="http://schemas.cssz.cz/ELDP09" sqnr="1" yer="2009" typ="01" dep="660" nam="HB"></eldp09>
</zdrojdok>
</xmlZdroj>');
SELECT sqnr,yer
INTO r1X,r2X
FROM xmltable(XMLNamespaces('http://schemas.cssz.cz/ELDP09' AS "xx"),
'/xx:xmlZdroj/xx:zdrojdok/xx:eldp09'
PASSING xmldocX
COLUMNS
sqnr VARCHAR2(10) PATH '@xx:sqnr',
yer VARCHAR2(10) PATH '@xx:yer'
);
DBMS_OUTPUT.PUT_LINE('result: '||nvl(r1X,'null')||' '||nvl(r2X,'null'));
END;
/
如果我删除了ELDP09元素和XMLTABLE中的xmlns规范,代码就可以工作并给出预期的结果。你能告诉我如何在命名空间存在的情况下实现同样的效果吗?我也尝试过在XMLTABLE中使用默认的命名空间规范,但也没有用。
1条答案
按热度按时间qyyhg6bp1#
xmlns="http://schemas.cssz.cz/ELDP09"
仅适用于xmlZdroj/zdrojdok/eldp09
元素,其父元素没有此命名空间。而且属性在XML文档中没有命名空间,所以也要从路径中删除命名空间。你可以检查这个关于属性命名空间的问题来了解更多细节:XML namespaces and attributes
将它们合在一起,您将得到:
| 序列号|叶尔|
| - -|- -|
| 一个|二〇 〇九年|
fiddle