, , , , , , ,

Вывод неразрывного пробела при формирование html с помощью xmltransform (outputting nbsp to HTML when use xmltransform)

пятница, 9 апреля 2010 г. 0 коммент.

При формировании HTML, в котором используется неразрывный пробел надо учесть пару особенностей:

  • Для вывода надо использовать команду


  • <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>

  • Неразрывный пробел является недопустимым элементов в xml. Поэтому попытка получить xml после преобразования завершиться ошибкой


  • ORA-31011: XML parsing failed
    ORA-19202: Error occurred in XML processing
    LPX-00118: Warning: undefined entity "nbsp"
    Error at line 1

    поэтому преобразование должно вернуть не xml, а clob или varchar2, для этого необходимо использовать функцию getclobval().

Пример:

select xmltransform(xmldata.depts,
xmltype('<?xml version="1.0" encoding="Windows-1251"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<body>
<table border="1" cols="3">
<xsl:for-each select="/DEPARTMENTS/DEPARTMENT">
<tr><td><xsl:value-of select="@DEPTNO"/></td>
<td colspan="2"><xsl:value-of select="@DNAME"/></td>
</tr>
<xsl:for-each select="EMPLOYEE">
<tr><td><xsl:value-of select="EMPNO"/></td>
<td><xsl:value-of select="ENAME"/></td>
<td><xsl:value-of select="JOB"/></td>
</tr>
</xsl:for-each>
<xsl:if test="position() != last()">
<tr><td colspan="3">
<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
</td></tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>')
).getclobval()
from (
select xmlelement(departments, xmlagg(
xmlelement(department,
xmlattributes(emp.deptno,
(select dname from dept where deptno = emp.deptno) as dname),
xmlagg(xmlelement(employee,
xmlforest(emp.empno, emp.ename, emp.job))
))
)) as depts
from emp
group by emp.deptno
) xmldata

Результат:

<?xml version="1.0" encoding="UTF-8"?>
<html>
<body>
<table border="1" cols="3">
<tr>
<td>10</td>
<td colspan="2">ACCOUNTING</td>
</tr>
<tr>
<td>7782</td>
<td>CLARK</td>
<td>MANAGER</td>
</tr>
<tr>
<td>7839</td>
<td>KING</td>
<td>PRESIDENT</td>
</tr>
<tr>
<td>7934</td>
<td>MILLER</td>
<td>CLERK</td>
</tr>
<tr>
<td colspan="3">&nbsp;</td>
</tr>
<tr>
<td>20</td>
<td colspan="2">RESEARCH</td>
</tr>
<tr>
<td>7369</td>
<td>SMITH</td>
<td>CLERK</td>
</tr>
<tr>
<td>7902</td>
<td>FORD</td>
<td>ANALYST</td>
</tr>
<tr>
<td>7876</td>
<td>ADAMS</td>
<td>CLERK</td>
</tr>
<tr>
<td>7788</td>
<td>SCOTT</td>
<td>ANALYST</td>
</tr>
<tr>
<td>7566</td>
<td>JONES</td>
<td>MANAGER</td>
</tr>
<tr>
<td colspan="3">&nbsp;</td>
</tr>
<tr>
<td>30</td>
<td colspan="2">SALES</td>
</tr>
<tr>
<td>7499</td>
<td>ALLEN</td>
<td>SALESMAN</td>
</tr>
<tr>
<td>7698</td>
<td>BLAKE</td>
<td>MANAGER</td>
</tr>
<tr>
<td>7654</td>
<td>MARTIN</td>
<td>SALESMAN</td>
</tr>
<tr>
<td>7844</td>
<td>TURNER</td>
<td>SALESMAN</td>
</tr>
<tr>
<td>7900</td>
<td>JAMES</td>
<td>CLERK</td>
</tr>
<tr>
<td>7521</td>
<td>WARD</td>
<td>SALESMAN</td>
</tr>
</table>
</body>
</html>


Читать полностью

, , , ,

xsd datetime в Oracle DB

понедельник, 5 апреля 2010 г. 0 коммент.

Для преобразования даты и времени из DB Oracle в дату и время XSD можно воспользоваться следующим шаблоном 'yyyy-mm-dd"T"hh24:mi:ss.ff6tzr'.
Почитать о дате и времени в xsd можно тут. О форматах шаблона преобразования в Oracle DB тут.

Посмотрим на примерах, преобразуем дату и время в datetime xsd.


select xmlelement(depts, xmlagg(
xmlelement(dept,
xmlforest(deptno,
dname,
loc,
to_char(systimestamp+numtodsinterval(rownum,'minute'),
'yyyy-mm-dd"T"hh24:mi:ss.ff6tzr') as ts
)
)
)).getclobval()
from dept;

Результат:

<DEPTS>
<DEPT>
<DEPTNO>10</DEPTNO>
<DNAME>ACCOUNTING</DNAME>
<LOC>NEW YORK</LOC>
<TS>2010-03-29T18:59:48.898873+04:00</TS>
</DEPT>
<DEPT>
<DEPTNO>20</DEPTNO>
<DNAME>RESEARCH</DNAME>
<LOC>DALLAS</LOC>
<TS>2010-03-29T19:00:48.898873+04:00</TS>
</DEPT>
<DEPT>
<DEPTNO>30</DEPTNO>
<DNAME>SALES</DNAME>
<LOC>CHICAGO</LOC>
<TS>2010-03-29T19:01:48.898873+04:00</TS>
</DEPT>
<DEPT>
<DEPTNO>40</DEPTNO>
<DNAME>OPERATIONS</DNAME>
<LOC>BOSTON</LOC>
<TS>2010-03-29T19:02:48.898873+04:00</TS>
</DEPT>
</DEPTS>

А теперь datetime xsd преобразуем в timestamp Oracle DB.

SQL> COLUMN DEPTNO FORMAT A8
SQL> COLUMN DNAME FORMAT A12
SQL> COLUMN LOC FORMAT A12
SQL>
SQL> select extractvalue(value(row_dept), '/DEPT/DEPTNO') as deptno,
2 extractvalue(value(row_dept), '/DEPT/DNAME') as dname,
3 extractvalue(value(row_dept), '/DEPT/LOC') as loc,
4 to_timestamp_tz(extractvalue(value(row_dept), '/DEPT/TS'),
5 'yyyy-mm-dd"T"hh24:mi:ss.ff6tzh:tzm') as ts
6 from (
7 select xmltype(
8 '<DEPTS>
9 <DEPT>
10 <DEPTNO>10</DEPTNO>
11 <DNAME>ACCOUNTING</DNAME>
12 <LOC>NEW YORK</LOC>
13 <TS>2010-03-29T18:59:48.898873+04:00</TS>
14 </DEPT>
15 <DEPT>
16 <DEPTNO>20</DEPTNO>
17 <DNAME>RESEARCH</DNAME>
18 <LOC>DALLAS</LOC>
19 <TS>2010-03-29T19:00:48.898873+04:00</TS>
20 </DEPT>
21 <DEPT>
22 <DEPTNO>30</DEPTNO>
23 <DNAME>SALES</DNAME>
24 <LOC>CHICAGO</LOC>
25 <TS>2010-03-29T19:01:48.898873+04:00</TS>
26 </DEPT>
27 <DEPT>
28 <DEPTNO>40</DEPTNO>
29 <DNAME>OPERATIONS</DNAME>
30 <LOC>BOSTON</LOC>
31 <TS>2010-03-29T19:02:48.898873+04:00</TS>
32 </DEPT>
33 </DEPTS>') as xml_data
34 from dual
35 ) xml_table,
36 table(xmlsequence(extract(xml_table.xml_data, '/DEPTS/DEPT'))) row_dept;

DEPTNO DNAME LOC TS
-------- ------------ ------------ -------------------------------------------------
10 ACCOUNTING NEW YORK 29.03.10 18:59:48,898873000 +04:00
20 RESEARCH DALLAS 29.03.10 19:00:48,898873000 +04:00
30 SALES CHICAGO 29.03.10 19:01:48,898873000 +04:00
40 OPERATIONS BOSTON 29.03.10 19:02:48,898873000 +04:00


Читать полностью