甲骨文11.2甲骨文的XMLQuery將不需要命名空間
下面是一個XMLQuery
我跑的上XMLType
列削減版本。當我運行查詢時,它會簡單地解析並重新創建存儲的XML
,不需要的默認和tsip命名空間會插入到父級的子元素中。請注意,tsxm命名空間沒有被插入,這是因爲它不等於默認的命名空間。這個查詢什麼都不做,很容易被重寫,但真正的(更大的)查詢使用了相同的方法,所以這就是爲什麼我以這種格式發佈問題。
創建表:
CREATE TABLE XML_DOCUMENT_TMP
(
DOCUMENT_ID NUMBER(12) NOT NULL,
XML_DATA SYS.XMLTYPE NOT NULL,
CREATED_DATE TIMESTAMP(6) NOT NULL
);
插入一些數據(其中必須有命名空間爲爲):
insert into XML_DOCUMENT_TMP
(document_id,created_date,xml_data)
values(1,sysdate,
'<patent xmlns="http://schemas.thomson.com/ts/20041221/tsip"
xmlns:tsip="http://schemas.thomson.com/ts/20041221/tsip"
xmlns:tsxm="http://schemas.thomson.com/ts/20041221/tsxm"
tsip:action="replace" tsip:cc="CA" tsip:se="2715340" tsip:ki="C">
<accessions tsip:action="replace">
<accession tsip:src="wila" tsip:type="key">CA-2715340-C</accession>
<accession tsip:src="tscm" tsip:type="tscmKey">CA-2715340-C-20150804</accession>
</accessions>
<claimed tsip:action="replace">
< claimsTsxm tsip:lang="en">
<tsxm:heading tsxm:align="left">We Claim:</tsxm:heading>
<claimTsxm tsip:no="1" tsxm:num="1" tsip:type="main">1. power. </claimTsxm>
</claimsTsxm>
</claimed>
</patent>
');
運行XMLQuery
:
注意需要命名空間通配符是解釋here
WITH tmpTable AS (
SELECT * FROM XML_DOCUMENT_TMP cm)
SELECT tt.xml_data ,
XMLQuery('declare default element namespace "http://schemas.thomson.com/ts/20041221/tsip";
declare namespace tsip="http://schemas.thomson.com/ts/20041221/tsip";
declare namespace tsxm="http://schemas.thomson.com/ts/20041221/tsxm";
return
<patent>{$m/*:patent/@*}
{
for $i in $m/*:patent/*
return $i
}
</patent>'
PASSING tt.xml_data as "m" RETURNING CONTENT) newXml
FROM tmpTable tt
WHERE tt.document_id in (1);
返回:
<patent xmlns="http://schemas.thomson.com/ts/20041221/tsip" xmlns:tsip="http://schemas.thomson.com/ts/20041221/tsip" tsip:action="replace" tsip:cc="CA" tsip:se="2715340" tsip:ki="C">
<accessions xmlns="http://schemas.thomson.com/ts/20041221/tsip" xmlns:tsip="http://schemas.thomson.com/ts/20041221/tsip" tsip:action="replace">
<accession tsip:src="wila" tsip:type="key">CA-2715340-C</accession>
<accession tsip:src="tscm" tsip:type="tscmKey">CA-2715340-C-20150804</accession>
</accessions>
<claimed xmlns="http://schemas.thomson.com/ts/20041221/tsip" xmlns:tsip="http://schemas.thomson.com/ts/20041221/tsip" tsip:action="replace">
<claimsTsxm tsip:lang="en">
<tsxm:heading xmlns:tsxm="http://schemas.thomson.com/ts/20041221/tsip" tsxm:align="left">We Claim:</tsxm:heading>
<claimTsxm tsip:no="1" xmlns:tsxm="http://schemas.thomson.com/ts/20041221/tsip" tsxm:num="1" tsip:type="main">1. power.</claimTsxm>
</claimsTsxm>
</claimed>
如何擺脫在種質創建不必要的命名空間和要求的元素。 任何建議表示讚賞。
一個快速和骯髒的方法是使用恆等變換XSLT處理您的輸出。看起來雖然過分,但我不願意稱之爲你的最佳解決方案,除非它是唯一的解決方案,但我對此表示懷疑。 – Flynn1179
@ Flynn1179此解決方案(在XMLQuery中執行xml處理)恰恰是爲了避免使用xslt,它太慢(對於大型XMLType)。 –
你可以試試'DBMS_XMLDOM.REMOVEATTRIBUTE'嗎?我不確定它是否是一個可行的解決方案。 – Mark