由于我们已将数据库从 11.2.0.2.0 移动到 11.2.0.4.0xmltype.transform
函数有特定的行为。
问题是,之前它不能正常工作:它用开闭版本替换了所有标签(例如,它确实替换了<br />
with <br></br>
),但我可以忍受。现在它的行为却相反(用一个标签替换所有内容),这造成了一个大问题<script></script>
标签,因为这个标签must明确地用 a 关闭</script>
否则浏览器认为没有关闭,即使关闭了所以<script />
=> 现在所有网页都已损坏。
Example:
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>
我猜问题出在格式上,但我没有设置任何其他东西来启用它......
有趣的是,我发现了本文另一个问题,但具有与解决方案相同的解决方法:
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).
当然,我会使用这个解决方法,但是,请告诉我:是否可以在不更改代码的情况下使其再次工作?
这种行为的原因是什么?
先感谢您。