如果您的 XSLT 使用xsl:include
您可能会收到奇怪的无法解释的错误,但最终结果总是相同:您的转换失败。
请参阅此 chromium bug 报告并支持它!http://code.google.com/p/chromium/issues/detail?id=8441 http://code.google.com/p/chromium/issues/detail?id=8441
但该错误实际上是在 webkit 中。欲了解更多信息here's http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/XSLT/Q_24311395.html另一个链接更详细地说明了它不起作用的原因。
解决这个问题的唯一方法是预处理样式表,以便它注入包含的样式表。这就是像 Sarissa 这样的跨浏览器 XSLT 库会自动为您做的事情。
如果您正在寻找 jQuery 解决方案:
http://plugins.jquery.com/project/Transform/ http://plugins.jquery.com/project/Transform/是一个跨浏览器的XSL插件。我已经成功地使用它来获得xsl:include
过去工作没有太多麻烦。您不必重写您的 xsl,这个插件将为您预处理它们。绝对值得一看,因为它比 Sarissa 更轻。
UPDATE:
<html>
<head>
<script language="javascript" src="jquery-1.3.2.min.js"></script>
<script language="javascript" src="jquery.transform.js"></script>
<script type="text/javascript">
function loadXML(file)
{
var xmlDoc = null;
try //Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.load(file);
}
catch(e)
{
try //Firefox, Mozilla, Opera, etc.
{
xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.async=false;
xmlDoc.load(file);
}
catch(e)
{
try //Google Chrome
{
var xmlhttp = new window.XMLHttpRequest();
xmlhttp.open("GET",file,false);
xmlhttp.send(null);
xmlDoc = xmlhttp.responseXML.documentElement;
}
catch(e)
{
error=e.message;
}
}
}
return xmlDoc;
}
function xslTransform(xmlObject, xslObject)
{
try
{
$("body").append("<div id='test'></div>");
var a = $("#test").transform({ xmlobj: xmlObject, xslobj: xslObject });
}
catch (exception)
{
if (typeof (exception) == "object" && exception.message)
alert(exception.message);
else alert(exception);
}
}
var xmlObject = loadXML("input.xml");
var xslObject = loadXML("transform.xsl");
$(document).ready(function()
{
xslTransform(xmlObject, xslObject);
});
</script>
</head>
<body>
</body>
</html>
此测试 html 页面在 Chrome/FireFox/IE 中均有效。
input.xml 只是一个简单的 xml 文件,包含<root />
transform.xsl 是您发布的精简的 xsl。
EDIT
然而,似乎 $.transform 从包含的文件导入样式表时遇到问题:
解决此问题的方法如下:
Locate
var safariimportincludefix = function(xObj,rootConfig) {
in jquery.transform.js
并将整个函数替换为:
var safariimportincludefix = function(xObj,rootConfig) {
var vals = $.merge($.makeArray(xObj.getElementsByTagName("import")),$.makeArray(xObj.getElementsByTagName("include")));
for(var x=0;x<vals.length;x++) {
var node = vals[x];
$.ajax({
passData : { node : node, xObj : xObj, rootConfig : rootConfig},
dataType : "xml",
async : false,
url : replaceref(node.getAttribute("href"),rootConfig),
success : function(xhr) {
try {
var _ = this.passData;
xhr = safariimportincludefix(xhr,_.rootConfig);
var imports = $.merge(childNodes(xhr.getElementsByTagName("stylesheet")[0],"param"),childNodes(xhr.getElementsByTagName("stylesheet")[0],"template"));
var excistingNodes = [];
try
{
var sheet = _.xObj;
var params = childNodes(sheet,"param");
var stylesheets = childNodes(sheet,"template");
existingNodes = $.merge(params,stylesheets);
}
catch(exception)
{
var x = exception;
}
var existingNames = [];
var existingMatches = [];
for(var a=0;a<existingNodes.length;a++) {
if(existingNodes[a].getAttribute("name")) {
existingNames[existingNodes[a].getAttribute("name")] = true;
} else {
existingMatches[existingNodes[a].getAttribute("match")] = true;
}
}
var pn = _.node.parentNode;
for(var y=0;y<imports.length;y++) {
if(!existingNames[imports[y].getAttribute("name")] && !existingMatches[imports[y].getAttribute("match")]) {
var clonednode = _.xObj.ownerDocument.importNode(imports[y],true);
//pn.insertBefore(clonednode,_.xObj);
pn.insertBefore(clonednode,childNodes(_.xObj,"template")[0]);
}
}
pn.removeChild(_.node);
} catch(ex) {
}
}
});
}
return xObj;
};
现在使用之前粘贴的测试index.html,将其用于transform.xsl
:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:include href="include.xsl" />
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:call-template name="giveMeAnIncludedHeader" />
</xsl:template>
</xsl:stylesheet>
而这对于include.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template name="giveMeAnIncludedHeader">
<h1>Test</h1>
</xsl:template>
</xsl:stylesheet>
随着之前发布的修复jquery.transform.js
现在将插入包含的<h1>Test</h1>
在所有浏览器上。
您可以在这里看到它的实际效果:http://www.mpdreamz.nl/xsltest http://www.mpdreamz.nl/xsltest