由于我们已将数据库从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)。
我当然会使用此解决方法,但是,请告诉我:是否可以在不更改代码的情况下再次使用它?
这种行为的原因是什么?
提前谢谢。