Обработчик DBMS_XSLP обрабатывает таблицы стилей с расширениями? - PullRequest
0 голосов
/ 20 августа 2011

Я пытался заставить 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.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 20 августа 2011

Я не могу помочь вам с процессором Oracle XSLT, но могу сказать, что не существует стандартов для вызова Java из XSLT - каждый процессор делает свое дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...