Меню сайта |
|
Форма входа |
|
Категории раздела |
|
Поиск |
|
Статистика |
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
|
Приветствую Вас, Гость · RSS |
18.01.2025, 14:12 |
|
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;
|
Категория: Все про Oracle | Добавил: basil (08.06.2011)
|
Просмотров: 4235
| Рейтинг: 0.0/0 |
|
|