Javascript 在webkit浏览器的xsl文件中使用多个xml文件(客户端转换)
我目前正在尝试将多个xml文件放入xsl文件中,然后将它们处理成有用的html。这适用于非webkit浏览器,但不适用于webkit浏览器 我正在使用JavaScript来执行转换,它可以在所有浏览器中正常工作,如果我想在其中包含多个xml文件的话 我尝试了各种方法,试图将额外的xml文件放入xsl,这些文件都在同一台服务器上,但在不同的文件夹中 1我尝试过直接将xml文件作为变量添加。例如:Javascript 在webkit浏览器的xsl文件中使用多个xml文件(客户端转换),javascript,xml,xslt,webkit,client-side,Javascript,Xml,Xslt,Webkit,Client Side,我目前正在尝试将多个xml文件放入xsl文件中,然后将它们处理成有用的html。这适用于非webkit浏览器,但不适用于webkit浏览器 我正在使用JavaScript来执行转换,它可以在所有浏览器中正常工作,如果我想在其中包含多个xml文件的话 我尝试了各种方法,试图将额外的xml文件放入xsl,这些文件都在同一台服务器上,但在不同的文件夹中 1我尝试过直接将xml文件作为变量添加。例如: <xsl:variable name="structure" select="document(
<xsl:variable name="structure" select="document('../structure.xml')"/>
loadXMLDoc是一段加载xml和xsl文件的简单代码
function loadXMLDoc(fname) {
var isIE = (navigator.appName=="Microsoft Internet Explorer");
if (window.XMLHttpRequest) {
xhttp = new XMLHttpRequest();
}
else {
xhttp = new ActiveXObject('Microsoft.XMLHTTP');
}
xhttp.open('GET', fname, false);
if (xhttp.overrideMimeType){
xhttp.overrideMimeType('text/xml');
}
xhttp.send(null);
if (isIE) {
xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
xmlDoc.async = false;
xmlDoc.load(fname);
}
else {
xmlDoc = xhttp.responseXML;
if (!xmlDoc) {
xmlDoc = (new DOMParser()).parseFromString(xhttp.responseText, 'text/xml');
}
}
return xmlDoc;
}
这不起作用,因为webkit不允许将节点设置为参数。再说一次,任何形式的工作都会很精彩
3我尝试了上述方法,但在作为参数添加之前将xml转换为字符串。这允许我获取要传递的参数,但无法将字符串转换回xml进行处理
如果有人对此有任何想法,那也太好了
我想到的另一个选择是使用JavaScript将xml文件合并成一个巨大的文件并进行处理,但我不知道如何做到这一点
此外,我无法进行服务器端处理,因为我无法控制服务器,所以只剩下客户端
正如我之前所说,我可以解决非webkit浏览器的问题。我试图解决这个问题已经有一段时间了,但找不到任何解决办法。我看不出我是唯一一个有这个问题的人,我真的希望有人也有类似的问题,并找到了解决办法或解决办法
提前谢谢
马特
更新:
我还考虑过在JavaScript中添加xml文件
xml=loadXMLDoc("structure.xml);
xsl=loadXMLDoc("xsl/head.xsl");
structurexml =loadXMLDoc("/extranet/structure.xml");
newxml = xml;
newxml.appendChild(sessionxml);
但是得到一个未捕获错误:HIERARCHY\u REQUEST\u ERR:DOM异常3,我认为这是由于新xml中没有根节点这一事实造成的?有人知道我怎样才能成功地添加它们吗?这两个文件是
<?xml version="1.0" encoding="utf-8"?>
<structure>
<product>
<id>1</id>
<unit>
<id>1</id>
<name>Blah</name>
<code>Blah</code>
</unit>
</product>
</structure>
及
有没有一种简单的方法可以在JavaScript或JQuery中实现这一点?是一种编译成JavaScript的XSLT 2.0处理器,将在webkit和所有主要浏览器中运行,自然支持文档功能。除了原子值之外,它还支持作为参数传递的文档、节点、数组甚至JavaScript对象
您可以使用与您自己的代码非常类似的代码运行转换,但使用:
xsltProcessor = Saxon.createXSLT20Processor();
但是,也可以使用以下JavaScript
Saxon.run({
stylesheet: "xsl/head.xsl",
source: "structure.xml",
parameters: {
structure: Saxon.requestXML("/extranet/structure.xml");
}
});
“structure”参数仅用于说明目的,在您的情况下,您只需要在XSLT中正常使用document函数
我还应该提到,使用Saxon CE,可以使用标准XSLT 2.0 xsl:result-document指令对HTML文档进行更新。因此,如果您想通过添加paragrah来更新id为“head”的DIV元素,您可以使用:
<xsl:result-document href="#head" method="append-content">
<p>Book Title: <xsl:value-of select="$title"/></p>
</xsl:result-document>
是编译为JavaScript的XSLT2.0处理器,将在webkit和所有主要浏览器中运行,自然支持文档功能。除了原子值之外,它还支持作为参数传递的文档、节点、数组甚至JavaScript对象
您可以使用与您自己的代码非常类似的代码运行转换,但使用:
xsltProcessor = Saxon.createXSLT20Processor();
但是,也可以使用以下JavaScript
Saxon.run({
stylesheet: "xsl/head.xsl",
source: "structure.xml",
parameters: {
structure: Saxon.requestXML("/extranet/structure.xml");
}
});
“structure”参数仅用于说明目的,在您的情况下,您只需要在XSLT中正常使用document函数
我还应该提到,使用Saxon CE,可以使用标准XSLT 2.0 xsl:result-document指令对HTML文档进行更新。因此,如果您想通过添加paragrah来更新id为“head”的DIV元素,您可以使用:
<xsl:result-document href="#head" method="append-content">
<p>Book Title: <xsl:value-of select="$title"/></p>
</xsl:result-document>
你好,pgfearo,感谢您抽出时间阅读我的问题并为我提供解决方案。非常感谢。只是想知道您是否知道有一种解决方案不使用需要许可的产品?我遇到的问题是,一个内部网站不能给公司带来任何收入,因此他们不太可能愿意为许可证付费。如果不是,我认为我唯一的解决方案是显示一条消息,要求用户下载可用的浏览器,即非webkit浏览器。再次感谢你的帮助@MattH我昨天才遇到这个问题,我没有尝试过:我认为CORS规范是Webkit支持的,因此如果您能够为所需的HTTP头正确设置承载XML的web服务器,您可能会获得一些成功。感谢您的帮助。如果公司愿意为您的解决方案付费,您的解决方案将有效,因此我感谢您花时间提供答案。已决定显示一条消息,说明不支持webkit浏览器,并添加了指向其他浏览器的链接以供下载。不太好,我知道,但是我必须和其他人一起等待bug被修复。嗨,pgfearo,谢谢
感谢您花时间阅读我的问题并为我提供解决方案。非常感谢。只是想知道您是否知道有一种解决方案不使用需要许可的产品?我遇到的问题是,一个内部网站不能给公司带来任何收入,因此他们不太可能愿意为许可证付费。如果不是,我认为我唯一的解决方案是显示一条消息,要求用户下载可用的浏览器,即非webkit浏览器。再次感谢你的帮助@MattH我昨天才遇到这个问题,我没有尝试过:我认为CORS规范是Webkit支持的,因此如果您能够为所需的HTTP头正确设置承载XML的web服务器,您可能会获得一些成功。感谢您的帮助。如果公司愿意为您的解决方案付费,您的解决方案将有效,因此我感谢您花时间提供答案。已决定显示一条消息,说明不支持webkit浏览器,并添加了指向其他浏览器的链接以供下载。不太好,我知道,但将不得不等待它与其他人的错误得到修复。