XSLT преобразование в PLSQL

А) Если делать все внутри PLSQL, то есть если есть
l_xsl := XMLType(xsl);
l_xml := XMLType(xml);

для преобразования внутри PLSQL можно использовать
1.  select xmltransform(l_xml, l_xsl).GetClobVal() into l_result from dual;
или
2.  l_result := l_xml.transform(l_xsl).GetClobVal();

на небольших размерах xml и xsl 2-й вариант работает раз в 10 быстрее.

Б) XMLType можно хранить в таблице:

CREATE TABLE mytable1_tmp
(xsl_column XMLType,
xml_column XMLType);

и делать преобразование:
select xmltransform(xml_column, xsl_column) from mytable1_tmp

В) Если работать через CLOB, на стороне базы он будет в кодировке базы, а
на стороне клиента – в кодировке клиента (NLS_LANG). Чтобы использовать другую произвольную
кодировку, чтобы, например, потом записать в файл, результат должен быть RAW или BLOB.

XMLType можно перекодировать так:

SELECT XMLSERIALIZE(CONTENT t.xml_column AS BLOB ENCODING ‘KOI8-R’)
FROM mytable1_tmp t;
или
l_blob := l_xml.GetBlobVal(NLS_CHARSET_ID(‘CL8KOI8R’) );

перекодировать CLOB можно, например, так:

procedure recode(p_in IN CLOB,
x_out IN OUT NOCOPY BLOB,
p_charset IN varchar2)
is
l_buff varchar2(32000);
l_buffer_size PLS_INTEGER := 1024;
l_offset PLS_INTEGER := 1;
l_amount PLS_INTEGER := 0;
begin
l_amount := least(l_buffer_size, length(p_in) – l_offset + 1);
loop
l_amount := least(l_buffer_size, length(p_in) – l_offset + 1);
exit when (l_amount = 0);
dbms_lob.read(p_in,
l_amount,
l_offset,
l_buff);
exit when (l_amount = 0);
l_offset := l_offset + l_amount;
dbms_lob.append(x_out, utl_i18n.string_to_raw(l_buff, p_charset)  );
end loop;
exception
when no_data_found then null; — dbms_lob.read raises the exception when reading past EOF
end;

Г) Пример с xslt:

declare
l_xsl varchar2(2000) := ‘
<xsl:stylesheet version=”2.0″
xmlns:xsl=“http://www.w3.org/1999/XSL/Transform”
xmlns:fn=“http://www.w3.org/2005/xpath-functions”
xmlns:xs=“http://www.w3.org/2001/XMLSchema”>
<xsl:output method=”html” encoding=”UTF-8″ indent=”yes”/>
<xsl:template match=”/table”>
<html>
<body>
<xsl:apply-templates select=”title”/>
<xsl:apply-templates select=”rowset”/>
</body>
</html>
</xsl:template>
<xsl:template match=”title”>
<h1><xsl:value-of select=”.”></xsl:value-of></h1>
</xsl:template>
<xsl:template match=”rowset”>
<table border=”2″ cellpadding=”2″ cellspacing=”2″ >
<xsl:apply-templates select=”row”/>
</table>
</xsl:template>
<xsl:template match=”row”>
<tr>
<xsl:apply-templates select=”field”/>
</tr>
</xsl:template>
<xsl:template match=”field”>
<td>
<xsl:value-of select=”.”></xsl:value-of>
</td>
</xsl:template>
</xsl:stylesheet>’;
l_xml varchar2(2000) := ‘
<table>
<title>The table</title>
<rowset>
<row>
<field>value1</field>
<field>value2</field>
</row>
<row>
<field>значение 1</field>
<field>значение 2</field>
</row>
</rowset>
</table>’;
l_result         CLOB;
l_xmlt           XMLType;
l_xslt           XMLType;
begin
l_xslt := XMLType(l_xsl);
l_xmlt := XMLType(l_xml);
select xmltransform(l_xmlt, l_xslt).GetClobVal() into l_result from dual;
dbms_output.put_line(l_result);
l_result := l_xmlt.transform(l_xslt).GetClobVal();
dbms_output.put_line(l_result);
end;