XSLT на PLSQL - проблема с кодировками

ava3443

Делаю преобразование XSLT на PLSQL в восьмом оракле. Исходный XML строится "руками" из базы, все данные в кодировке Windows-1251 (и это указано в заголовке исходного XML). После нехитрого преобразования
<?xml version="1.0" encoding="Windows-1251"?> 

<>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="Windows-1251" indent="yes" />
<xsl:template match="*|@*|comment|processing-instruction|text">
<xsl:copy>
<xsl:apply-templates select="*|@*|comment|processing-instruction|text"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

которое, по идее, должно выдать исходный XML, всё, что было по-русски, становится нечитаемым.
Например, "Транспортировка газа по трубопроводам" превращается в
"@0=A?>@>2:0 3070 ?> C1>?@>2>40<

Как с этим бороться?

ava3443

Да, кстати, используется Oracle XML Parser for PLSQL 8.1.7.2.0 и в readme к нему написано, что
The parser currently supports the following encodings: UTF-8, BIG 5, US-ASCII,
GB2312, EUC-JP, ISO-2022-JP, EUC-KR, ISO-2022-KR, KOI8-R, ISO-8859-1to -9, EBCDIC-CP-*, and Shift_JIS. UTF-8 is the default encoding if none is specified. Any other ASCII or EBCDIC based encodings that are supported by the Oracle 8i database may be used.

durka82

А если перевести исходный документ в utf-8 - работает?

ava3443

А как перекодировать из Windows-1251 в UTF-8 на PL/SQL? У меня ж все данные из базы, в кодировке Windows-1251

gopnik1994

<xsl:output method="xml" encoding="WINDOWS-1251"/>

ava3443

Это к чему? encoding у меня указан уже.

avinir60

Невнимательно прочитал и сказал чушь

ava3443

Кстати, испытания показали, что, если вызывать из командной строки, то всё супер:
java -cp xmlparserv2.jar oracle.xml.parser.v2.oraxsl test.xml ident.xsl text2.xml

ava3443

Почему из командной строки XSLT работает "на ура", а из процедуры - проблемы с кодировками?
Код у меня такой:
FUNCTION PROCESS (sourceCLOB CLOB, stylesheetCLOB CLOB) RETURN CLOB IS

parser XMLPARSER.Parser := XMLPARSER.newParser;
processor XSLPROCESSOR.Processor := XSLPROCESSOR.newProcessor;

sourceXML XMLDOM.DOMDocument;
stylesheetXML XMLDOM.DOMDocument;

stylesheet XSLPROCESSOR.Stylesheet;

result CLOB;

BEGIN

IF sourceCLOB IS NULL OR stylesheetCLOB IS NULL THEN
RETURN NULL;
END IF;

XMLPARSER.parseCLOB(parser, sourceCLOB);
sourceXML := XMLPARSER.getDocument(parser);

XMLPARSER.parseCLOB(parser, stylesheetCLOB);
stylesheetXML := XMLPARSER.getDocument(parser);

stylesheet := XSLPROCESSOR.newStylesheet(stylesheetXML, NULL);

dbms_lob.createtemporary(result, true) ;
XSLPROCESSOR.processXSL(processor, stylesheet, sourceXML, result);

XSLPROCESSOR.freeProcessor(processor);
XMLPARSER.freeParser(parser);
XMLDOM.freeDocument(sourceXML);
XMLDOM.freeDocument(stylesheetXML);
RETURN result;

EXCEPTION

WHEN OTHERS THEN

XSLPROCESSOR.freeProcessor(processor);
XMLPARSER.freeParser(parser);
XMLDOM.freeDocument(sourceXML);
XMLDOM.freeDocument(stylesheetXML);

RAISE;

END;

gopnik1994

подозреваю, что Оракл не понимает строку "Windows-1251"

ava3443

Да, очень похоже на то. Попробовал перекодировать в UTF-8 и потом делать XSLT - так перекодирование из Windows-1251 в UTF-8 не работает.
Зато работает такой вариант: перекодирую из Windows-1251 в ISO-8859-5, потом делаю XSLT.
Оставить комментарий
Имя или ник:
Комментарий: