Tôi biết điều này khá cũ, nhưng tôi đã phát hiện ra nó hôm nay và nhớ lại nỗi đau mà tôi đã trải qua khi cố gắng xử lý XML không gian tên. Giải pháp của tôi là loại bỏ các không gian tên bằng một biến đổi XSLT và xử lý nó dưới dạng XML cũ thuần túy. Chức năng tôi đã sử dụng để làm điều này là:
function remove_namespace( i_xml in xmltype )
return xmltype
is
v_xml xmltype default i_xml;
v_xsl varchar2(32767);
begin
v_xsl := '<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="*">
<!-- remove element prefix (if any) -->
<xsl:element name="{local-name()}">
<!-- process attributes -->
<xsl:for-each select="@*">
<!-- remove attribute prefix (if any) -->
<!-- this if filters out any xmlns="" atts that have no
namespace prefix in the xml -->
<xsl:if test="(local-name() != ''xmlns'')">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:if>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>';
return v_xml.transform(xmltype(v_xsl));
end;