Я пытался заставить DBMS_XSLProcessor (ТОЛЬКО пакет pl / sql) заставить его преобразовать простой XSL, имеющий расширение Java, согласно приемлемому соглашению для обработки таблиц стилей XSL с помощью инструментов, предоставляемых Oracle (пакет XSL Processor в база данных, а также набор разработчика XML на основе Java - XDK вне базы данных).
Вот пример XML-документа ( ceil.xml ) (слегка измененный по сравнению с примером math.xml, приведенным в Примерах XSLT базы данных 11gR1)
<?xml version="1.0"?>
<doc>
<n1>2.4</n1>
</doc>
Вот мой XSL под названием ceil.xsl:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mth="http://www.oracle.com/XSL/Transform/java/java.lang.Math"
>
<xsl:template match="/">
Should ciel n1 to "3": <xsl:value-of select="mth:ceil(//n1)"/>
</xsl:template>
</xsl:stylesheet>
Вот мой простой анонимный блок pl / sql:
DECLARE
indoc VARCHAR2(2000);
xsldoc VARCHAR2(2000);
myParser dbms_xmlparser.Parser;
indomdoc dbms_xmldom.domdocument;
xsltdomdoc dbms_xmldom.domdocument;
xsl dbms_xslprocessor.stylesheet;
outdomdocf dbms_xmldom.domdocumentfragment;
outnode dbms_xmldom.domnode;
proc dbms_xslprocessor.processor;
buf varchar2(2000);
BEGIN
indoc := '<?xml version="1.0"?><doc><n1>2.4</n1></doc>';
dbms_output.put_line( 'Input document [' || indoc || ']' );
xsldoc :=
'<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mth="http://www.oracle.com/XSL/Transform/java/java.lang.Math">
<xsl:template match="/">
Should ciel n1 to "3": <xsl:value-of select="mth:ceil(//n1)"/>
</xsl:template>
</xsl:stylesheet>';
dbms_output.put_line( 'before creating new parser:' || systimestamp );
myParser := dbms_xmlparser.newParser;
dbms_output.put_line( 'before parsing XML Doc:' || systimestamp );
dbms_xmlparser.parseBuffer(myParser, indoc);
indomdoc := dbms_xmlparser.getDocument(myParser);
dbms_output.put_line( 'before pulling parsed DOM of XML :' || systimestamp );
dbms_xmldom.writetobuffer(indomdoc, buf);
dbms_output.put_line(buf);
dbms_xmlparser.parseBuffer(myParser, xsldoc);
xsltdomdoc := dbms_xmlparser.getDocument(myParser);
dbms_output.put_line( 'before pulling parsed DOM of XSL :' || systimestamp );
xsl := dbms_xslprocessor.newstylesheet(xsltdomdoc, '');
proc := dbms_xslprocessor.newProcessor;
--apply stylesheet to DOM document
dbms_output.put_line( 'before processing XSL:' || systimestamp );
outdomdocf := dbms_xslprocessor.processxsl(proc, xsl, indomdoc);
outnode := dbms_xmldom.makenode(outdomdocf);
dbms_xmldom.writeToBuffer( outnode, buf );
dbms_output.put_line( 'after writing to output buffer:' || systimestamp );
dbms_output.put_line( 'Length of output =[' || LENGTH( buf ) || ']' );
dbms_output.put_line(buf);
END;
/
Выполнение этого в приглашении SQL дает мне следующий вывод (ошибка):
Input document [<?xml version="1.0"?><doc><n1>2.4</n1></doc>]
before creating new parser:19-AUG-11 03.32.33.471688000 PM -07:00
before parsing XML Doc:19-AUG-11 03.32.33.472413000 PM -07:00
before pulling parsed DOM of XML :19-AUG-11 03.32.33.476298000 PM -07:00
<?xml version="1.0"?>
<doc>
<n1>2.4</n1>
</doc>
before pulling parsed DOM of XSL :19-AUG-11 03.32.33.490319000 PM -07:00
DECLARE
*
ERROR at line 1:
ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00607: Invalid reference: 'ceil'.
ORA-06512: at "XDB.DBMS_XSLPROCESSOR", line 759
ORA-06512: at "XDB.DBMS_XSLPROCESSOR", line 782
ORA-06512: at line 44
Однако этот же код работает в командной строке UNIX при использовании утилиты oraxsl ...
-->oraxsl ceil.xml ceil.xsl
<?xml version = '1.0' encoding = 'UTF-8'?>
Should ciel n1 to "3": 3
-->
Есть идеи, почему не работает расширение Java, которое просто ссылается на встроенную функцию?
Это для базы данных Oracle Enterprise Edition версии 11.1.0.6.
Спасибо за вашу помощь.