Oracle PLSQL:xmltype.transform vs xmltransform

时间:2014-06-30 09:17:48

标签: sql xslt plsql transform oracle11gr2

由于我们已将数据库从11.2.0.2.0移动到11.2.0.4.0 xmltype.transform,因此函数有特定的行为。

问题是在它没有正常工作之前:它用开放式版本替换了所有标签(例如它确实用<br />取代<br></br>),但我可以忍受它。现在它的行为相反(用一个标签替换所有内容)并且<script></script>标记出现了大问题,因为此标记必须明确地用</script>关闭浏览器认为它没有关闭,即使它已关闭,所以<script /> =&gt;现在所有网页都已损坏。

示例:

declare
  xml      xmltype := new xmltype('<?xml version="1.0" encoding="ISO-8859-1"?><document></document>');
  xsl      xmltype := new xmltype('<?xml version="1.0" encoding="ISO-8859-1"?>
                                   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                                     <xsl:output method="html" />
                                     <xsl:template match="/">
                                       <html>
                                         <head>
                                           <script type="text/javascript" src="jquery-1.11.1.min.js"></script>
                                         </head>
                                         <body>
                                           <br />
                                         </body>
                                       </html>
                                     </xsl:template>
                                   </xsl:stylesheet>');
begin
  dbms_output.put_line(xml.transform(xsl,null).getclobval());
end;

在11.2.0.2.0中,其工作原理如下:

<html><head><script src="jquery-1.11.1.min.js"></script></head><body><br></br></body></html>

在11.2.0.4.0中,它的工作方式不同:

<html>
  <head>
    <script type="text/javascript" src="jquery-1.11.1.min.js"/>
  </head>
  <body>
    <br/>
  </body>
</html>

我猜问题是格式化,但我没有设置任何其他内容来启用它...

有趣的是,我发现this article有另一个问题,但解决方法与解决方法相同:

select xmltransform(xmltype('<?xml version="1.0" encoding="ISO-8859-1"?><document></document>'),
                    xmltype('<?xml version="1.0" encoding="ISO-8859-1"?>
                             <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                               <xsl:output method="html" />
                               <xsl:template match="/">
                                 <html>
                                   <head>
                                     <script src="jquery-1.11.1.min.js"></script>
                                   </head>
                                   <body>
                                     <br />
                                   </body>
                                 </html>
                               </xsl:template>
                             </xsl:stylesheet>')) html
from dual

这适用于每个版本,并提供正确的结果(加倍<br />的结果,但正如我所说,对我来说无关紧要。)

在Oracle文档中,没有任何关于这些功能的区别的说法;他们甚至多次说过它们是相同的功能(see here)。

我当然会使用此解决方法,但是,请告诉我:是否可以在不更改代码的情况下再次使用它?

这种行为的原因是什么?

提前谢谢。

0 个答案:

没有答案