请问有没有办法用js对xhtml的某一个片段进行xslt变换?(要求兼容IE6和Firefox1.0)

cat_hsfz 2005-03-20 01:00:40
我希望实现的效果类似这样:
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="gb2312">
<head>
<script type="text/javascript">
function sortDiv()
{
var oChioce=document.getElementById('choice');
var sXslt='<!--Some XML here-->';
//创建xml有关对象,读取字符串sXslt,在sXslt已中用<xsl:sort>声明了对choice中的<div>进行按内容进行排序
//使用xml对象对choice片段进行XSLT变换,把结果输出到名为oSortedChoice的HTMLDivElement。
//oSortedChoice的innerHTML应该是这样的:<div>Apple</div><div>Banana</div><div>Cat</div><div>Dog</div>
}
</script>
</head>
<body onload="sortDiv();">
<div id="choice">
<div>Banana</div>
<div>Dog</div>
<div>Apple</div>
<div>Cat</div>
</div>
</body>
</html>

请问sortDiv()应该怎么写?要求完全在客户端完成操作,并且兼容IE6和Firefox1.0。

其实这个问题主要头痛的是:
1.js没有内置的xml对象,那就必须调用外部xml对象,需要做到好的浏览器兼容性很难。
2.IE6的DOM是不符合规范的,读取出来的innerHTML里面对属性没有使用双引号括起来,是不能够直接当作xhtml进行transform的。
...全文
128 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cat_hsfz 2005-03-23
  • 打赏
  • 举报
回复
终于做完了,谢谢各位的支持。下面贴上代码,在IE6和Firefox1.0测试过,不知道其他浏览器的支持如何,有兴趣的话大家来测试下,希望能够改进到支持更多的浏览器。

(写这段代码在混淆了的Google Maps js里面搜索了一阵,其实也不太难搜索。)

function processXslt(sXml, sXslt)
{
if(window.navigator.userAgent.toLowerCase().indexOf('msie') != -1)
return processXsltForIE(sXml, sXslt);
if(window.navigator.userAgent.toLowerCase().indexOf('firefox') != -1)
return processXsltForFirefox(sXml, sXslt);
}

function processXsltForIE(sXml, sXslt)
{
var oXslt = new ActiveXObject("Msxml2.XSLTemplate.5.0");
var oXsltDocument = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.5.0");
var oXsltProcessor;
oXsltDocument.async = false;
oXsltDocument.resolveExternals = false;
oXsltDocument.loadXML(sXslt);
if (oXsltDocument.parseError.errorCode != 0)
{
///todo: return oXsltDocument.parseError;
alert("You have error " + myErr.reason);
}
else
{
oXslt.stylesheet = oXsltDocument;
var oXmlDocument = new ActiveXObject("Msxml2.DOMDocument.5.0");
oXmlDocument.async = false;
oXmlDocument.resolveExternals = false;
}
oXmlDocument.loadXML(sXml);
if (oXmlDocument.parseError.errorCode != 0) {
///todo: return oXmlDocument.parseError;
alert("You have error " + myErr.reason);
}
else
{
oXsltProcessor = oXslt.createProcessor();
oXsltProcessor.input = oXmlDocument;
oXsltProcessor.transform();
return(oXsltProcessor.output);
}
}

function processXsltForFirefox(sXml, sXslt)
{
var oDomParser = new DOMParser();
var oXsltProcessor = new window.XSLTProcessor();
var oXsltDocument = document.implementation.createDocument("", "", null);
oXsltDocument=oDomParser.parseFromString(sXslt, "text/xml")
oXsltProcessor.importStylesheet(oXsltDocument);
var oXmlDocument = document.implementation.createDocument("", "", null);
oXmlDocument=oDomParser.parseFromString(sXml, "text/xml")
var oResultDocument = document.implementation.createDocument("", "", null);
oResultDocument = oXsltProcessor.transformToDocument(oXmlDocument);
var oXmlSerializer = new XMLSerializer()
return oXmlSerializer.serializeToString(oResultDocument);
}
ttyp 2005-03-21
  • 打赏
  • 举报
回复
var style = new ActiveXObject("Microsoft.XMLDOM");
style.load("LstA_49.xsl");
strTransform = xmlDoc.transformNode(style.documentElement);
alert(strTransform);
cat_hsfz 2005-03-21
  • 打赏
  • 举报
回复
liu76xt((网事随逢)) ,您给的RegEx在对已经符合XHTML规范的innerHTML进行处理的时候还是会继续添加双引号,也就是说变成双重双引号,请问能否帮忙写一个RegEx能够对于已规范的XHTML就不做处理?
网事随逢 2005-03-21
  • 打赏
  • 举报
回复
,没有用过Firefox,呵呵。

不过我想既然“然而这需要XML和XSLT都是现成的文件,有没有办法把保存在脚本的string的XML和XSLT交给浏览器”,说明微软还是不会把接口轻易开放给用户,至少暂时不会[但是已经提供了文件接口],,

个人认为XML 解析器还是自己写的好。

--就知道这么多了,,,
cat_hsfz 2005-03-21
  • 打赏
  • 举报
回复
请问 ttyp(@http://www.cnblogs.com/ttyp/) ,您的方式适用于哪些浏览器?真的可以直接把一个HTML Element放进去Transform吗?
cat_hsfz 2005-03-20
  • 打赏
  • 举报
回复
谢谢 liu76xt((网事随逢)) 的正则表达式,我正准备找正则表达式处理该问题。

另外请问,对于Firefox,需要xml有关对象应该如何创建?其实IE6和Firefox1.0都是支持直接察看带有XSLT的XML的(例如MSN的聊天记录),然而这需要XML和XSLT都是现成的文件,有没有办法把保存在脚本的string的XML和XSLT交给浏览器,让它们用自身默认的XML Parser进行处理然后返回结果?
网事随逢 2005-03-20
  • 打赏
  • 举报
回复
关于第一个问题在IE里面有:

var a = new Object(MSXML2.XMLHTTP)
var b = new Object(Msxml2.DOMDocument.3.0)
var c = new Object(Msxml2.DOMDocument)

如果考虑到兼容的问题可能要变通一下处理----放到后台处理了。

网事随逢 2005-03-20
  • 打赏
  • 举报
回复
关于第二个问题可以使用JS进行正则转换:

<div id="tt">
<table width="100">
<tr><td>aaaaaaaaaaaaaaaaaa</td></tr>
</table>
</div>

<input type="button" name="but" value="test" onclick="trans(tt.innerHTML)">
<SCRIPT>
function trans(str)
{
alert(str.replace(/(\s+\w+=)([^\s<>]+)/g, "$1\"$2\""));
}
</SCRIPT>

87,921

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧