gpt4 book ai didi

javascript - 使用 JavaScript 的 Chrome 和 Safari XSLT

转载 作者:可可西里 更新时间:2023-11-01 02:19:10 24 4
gpt4 key购买 nike

我有以下应用 XSLT 样式的代码

Test.Xml.xslTransform = function(xml, xsl) {
try {
// code for IE
if (window.ActiveXObject) {
ex = xml.transformNode(xsl);
return ex;
}
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument) {
xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
resultDocument = xsltProcessor.transformToFragment(xml, document);
return resultDocument;
}
} catch (exception) {
if (typeof (exception) == "object") {
if (exception.message) {
alert(exception.message);
}
} else {
alert(exception);
}
}

该代码在 IE 和 firefox 中有效,但在 Chrome 和 Safari 中无效。有什么想法吗?

更新

ResultDocument = xsltProcessor.transformToFragment(xml, document);

上面的行返回空值。没有错误被抛出。

更新

代码不工作,因为 xslt 文件包含 xsl:include。需要找到一种方法来使包含工作,我将在此处粘贴进度

更新

有人建议我使用 http://plugins.jquery.com/project/Transform/插入。我正在尝试使用客户端库作为 include 示例(http://daersystems.com/jquery/transform/)。

代码在 IE 中有效,但在 chrome 中仍然无效。

Test.Xml.xslTransform = function(xml, xsl) {
try {
$("body").append("<div id='test' style='display:none;'></div>");
var a = $("#test").transform({ xmlobj: xml, xslobj: xsl });
return a.html();
}
catch (exception) {
if (typeof (exception) == "object") {
if (exception.message) {
alert(exception.message);
}
} else {
alert(exception);
}

}
}

xml 和 xsl 都是传入的对象。

更新

我尝试将 XSL 文件更改为非常简单的文件,没有包含,Chrome 仍然没有应用样式表,而 IE 是。作为对象引入的 XSL 是:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:spsoap="http://schemas.microsoft.com/sharepoint/soap/"
>
<xsl:output method="html"/>
<xsl:template match="/">
<h1>test</h1>
</xsl:template>

</xsl:stylesheet>

更新

我想要的最终结果是将 xsl 应用于 xml 文件。 xsl 文件中包含。我希望传输理想地发生在客户端上。

已更新Rupert 能否用 xml 更新问题以及如何调用 Test.Xml.xslTransform ?

我用ie8得到了xml

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><SearchListItemsResponse xmlns="http://schemas.microsoft.com/sharepoint/soap/"><SearchListItemsResult><listitems xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
<rs:data ItemCount="1">
<z:row ows_Title="Test" ows_FirstName="Test 4" ows_UniqueId="74;#{1A16CF3E-524D-4DEF-BE36-68A964CC24DF}" ows_FSObjType="74;#0" ows_MetaInfo="74;#" ows_ID="74" ows_owshiddenversion="10" ows_Created="2009-12-29 12:21:01" ows_FileRef="74;#Lists/My List Name/74_.000" ReadOnly="False" VerificationRequired="0"/>
</rs:data>
</listitems></SearchListItemsResult></SearchListItemsResponse></soap:Body></soap:Envelope>

调用代码如下:

xsl = Test.Xml.loadXMLDoc("/_layouts/xsl/xsl.xslt");
var doc = Test.Xml.xslTransform(xData.responseXML, xsl);

xData 是网络服务返回的 xml。

最佳答案

如果您的 XSLT 使用 xsl:include您可能会收到奇怪的无法解释的错误,但最终结果总是相同的:您的转换失败。

请查看此 chromium 错误报告并支持它! http://code.google.com/p/chromium/issues/detail?id=8441

这个错误实际上是在 webkit 中。更多信息 here's另一个链接更详细地说明了为什么它不起作用。

解决此问题的唯一方法是预处理样式表,以便它注入(inject)包含的样式表。这就是像 Sarissa 这样的跨浏览器 XSLT 库会自动为您做的事情。

如果您正在寻找 jQuery 解决方案:
http://plugins.jquery.com/project/Transform/是一个跨浏览器的 XSL 插件。我已经成功地使用它来获得 xsl:include过去工作没有太多麻烦。你不必重写你的 xsl,这个插件会为你预处理它们。绝对值得一看,因为它比 Sarissa 更轻。

更新:

<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 只是一个包含<root /> 的简单xml 文件transform.xsl 是您发布的精简版 xsl。

编辑

但是 $.transform 从包含的文件中导入样式表似乎确实有问题:

解决方法如下:

定位

var safariimportincludefix = function(xObj,rootConfig) {

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

关于javascript - 使用 JavaScript 的 Chrome 和 Safari XSLT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2042178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com