Oracle 11,2Oracle XMLQUERY chèn namespace không mong muốn
Dưới đây là một phiên bản cắt giảm của một XMLQuery
tôi đang chạy trên một cột XMLType
. Khi tôi chạy truy vấn, chỉ đơn giản là phân tích cú pháp và tạo lại các XML
được lưu trữ, các không mong muốn các không gian tên mặc định và tsip được chèn vào các phần tử con của phụ huynh. Lưu ý rằng không gian tên tsxm không được chèn vào, điều này là bởi vì nó không bằng không gian tên mặc định Truy vấn này không có gì và có thể viết lại dễ dàng, nhưng truy vấn thực (lớn hơn) sử dụng cùng phương pháp này vì vậy đây là lý do tại sao tôi đăng câu hỏi ở định dạng này.
tạo bảng:
CREATE TABLE XML_DOCUMENT_TMP
(
DOCUMENT_ID NUMBER(12) NOT NULL,
XML_DATA SYS.XMLTYPE NOT NULL,
CREATED_DATE TIMESTAMP(6) NOT NULL
);
Chèn một số dữ liệu (mà phải có không gian tên như là):
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>
');
Chạy XMLQuery
:
Lưu ý sự cần thiết của namespace wildcarding là được giải thích 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);
Returns:
<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>
Làm thế nào để thoát khỏi không gian tên mong muốn tạo ra trong gia nhập và khẳng định yếu tố. Bất kỳ đề xuất nào được đánh giá cao.
Một cách nhanh chóng & bẩn sẽ được xử lý đầu ra của bạn với XSLT sử dụng bản sắc biến đổi. Có vẻ như quá mức cần thiết, tôi sẽ miễn cưỡng gọi đó là giải pháp tốt nhất của bạn trừ khi nó trở thành người duy nhất, nhưng tôi nghi ngờ điều đó. – Flynn1179
@ Flynn1179 Giải pháp này (thực hiện xử lý xml trong XMLQuery) là chính xác để tránh sử dụng xslt, mà nó quá chậm (đối với các XMLTypes lớn). –
Bạn có thể thử 'DBMS_XMLDOM.REMOVEATTRIBUTE' không? Tôi không chắc chắn nếu nó là một giải pháp làm việc. – Mark