目的:写一个函数,根据表的某个clob字段(存储的是xml内容),及输入的标签,将对应的值取出来。
如:select getxmlattr(colname,'xsl:tel') as Tel from tablename;
问题:1、getnodevalue取不到节点的值。2、查找节点时,xpath如果含有namespace,则会报错:LPX-00601:Invalid token in...xml内容
<root>
  <test>
    <xsl:name>tom</xsl:name>
    <xsl:prop>
      <xsl:sex>man</xsl:sex>
      <xsl:tel>110</xsl:tel>
    </xsl:prop>
  </test>
</root>代码:
CREATE OR REPLACE function getxmlattr(t_xml clob,AttrName varchar2)
return varchar2
as
  tmpcontent clob;
  xmlpar xmlparser.parser;
  doc xmldom.domdocument;
  rootnode xmldom.domnode;
  tempnode xmldom.domnode;  Avalue varchar2(100);
begin
  if FPML is null or AttrName is null then
    return(null); 
  else
    tmpcontent := replace(t_xml,'xls:',''); --因为
  end if;  xmlpar := xmlparser.newparser;
  xmlparser.parseClob(xmlpar,tmpcontent);
  doc := xmlparser.getdocument(xmlpar);  xmlparser.freeparser(xmlpar);  rootnode := xmldom.makenode(doc);  
    
  tempnode := xslprocessor.selectSingleNode(rootnode,'//'||replace(AttrName,'xls:',''));  
  
  if xmldom.isNull(tempnode) then
xmldom.freenode(rootnode);  
    xmldom.freedocument(doc);
    return(null);
  end if;  
 
  Avalue := xmldom.getNodeValue(tempnode); --此处取不到值
  Avalue := xmldom.getNodeName(tempnode)||'='||Avalue;
  -- 释放文档对象
  xmldom.freenode(tempnode);
  xmldom.freenode(rootnode);  
  xmldom.freedocument(doc);
  
  return(AValue);
  exception
   when others then  
     dbms_output.put_line(sqlerrm);   
     return(null);
end getxmlattr;