原创,网站xml+xslt的解决方案,xslt支持分析,欢迎大家讨论
很少在CSDN上发自己的文章,昨天晚上临时写了个程序,拿出来给大家分享
程序中可能还有其他一些问题,请高手们指正和讨论,谢谢大家
缘由:
由于我网站原来就是全站的xml+xslt的格式,但是改版后编程纯xhtml格式了,还没有进行xml+xslt 的整合.根据以往的经验,好像在进行xml+xslt处理时候或多或少都出现过问题,于是我突然想到利用我以前写的判断flash插件的类似方法来判断是否xlst可以被正确解析。
需要说明的是 在此之前,我至少知道两种 判断的xslt支持的方法
其一 利用服务器端得到的 客户端浏览器信息,即服务器变量中得到浏览器版本 从而判断是否支持xslt
优点: 速度比较快,即使客户端不支持js也可以判断,而且不受浏览器类型的限制
缺点: 判断过程不严格,可能浏览器版本不符合要求,但是却可以支持xslt,或者版本符合要求,但是却不可以正确支持xslt,比如说csdn在某些机器上就不能正确用xml+xslt显示,我估计csdn就是用此种方法判断是否支持xslt
其二: 利用客户端的js来分析机器所支持的xslt,然后选择性的跳转。
比如用以下的这个函数
function sniff(){
var xml = "<?xml version=\"1.0\" encoding=\"UTF-16\"?><cjb></cjb>";
var xsl = "<?xml version=\"1.0\" encoding=\"UTF-16\"?><x:stylesheet version=\"1.0\" xmlns:x=\"http://www.w3.org/1999/XSL/Transform\" xmlns:m=\"urn:schemas-microsoft-com:xslt\"><x:template match=\"/\"><x:value-of select=\"system-property('m:version')\" /></x:template></x:stylesheet>";
//var xsl = "<?xml version=\"1.0\" encoding=\"UTF-16\"?><x:stylesheet version=\"1.0\" xmlns:x=\"http://www.w3.org/TR/WD-xsl\"></x:stylesheet>";
var x = null;
try{
x = new ActiveXObject("Microsoft.XMLDOM");
x.async = false;
x.loadXML(xml)
}catch(e){return(false)}
try{
var s = new ActiveXObject("Microsoft.XMLDOM");
s.async = false;
if (s.loadXML(xsl)){
try{
var op = x.transformNode(s);
if (op.indexOf("stylesheet") == -1){
return(true)
}
}catch(e){return(false)}
}
}catch(e){return(false)}
我以前的帖子里面提到过
优点: 对于IE浏览器可以准确的判断是否支持xslt
缺点: 受浏览器类型限制,只对IE有效,并且基于js技术,如果对方浏览器不支持js则无法使用,用js跳转,使得浏览不怎么方便。
对于以上两种解决方案我觉得都不够完美,于是就想了个自己的解决方案
基本原理: 既然要比较完美,那就要考虑到 可以真正的被解析,所以我嵌入了一个xml+xslt的测试页面,既然不用js,那么我跳转就用meta来控制,为了不必多次判断浏览器类型,所以我用cookie来判断。
1。 对于要访问的页面的开始 进行cookie的判断
判断一个 request.cookies("xsltSupport")的值是否存在,如果存在 则判断 当前是否支持xslt,由此来用server.execute来执行不同的文件
2。如果request.cookies("xsltSupport")的值不存在,进行xslt判断函数的调用
xslt判断函数中首先就设置了cookie的值
同时转移到另外一个探测页面D,同时把本页面的相关参数也用url传递过去,记住可能浏览器不支持cookie所以,session和cookie都不可以使用了就用url传值
3。在D页面中嵌套一个iframe,iframe是一个xml+xslt的文档X,对于D文档本身 会在3秒内自动跳转,并且D文档会判断cookie的值是否真正传递过来了,如果没有那么说明浏览器不支持cookie的,既然连cookie都不支持,那么只可以让对方以不支持xslt的格式进行浏览了
如果已经传值。那么设置cookies的值为xslt不支持(默认方式), 但是记住了 在iframe中的页面X 如果可以正确解析,那么将跳转到页面E,页面E中就是设置cookie说明浏览器支持xslt。此处有个先后次序,如果可以支持的话将修改原来的cookie值,从而真正的判断了是否xslt的支持
其关键部分是在于页面D和页X的meta跳转时间间隔不同,页面E时间为3秒,页面X为0秒,具体时间可以自己设定
4。D页面跳转的页面 为原来的页面,这时候就可以在原页面中利用cookie进行xslt支持的判断了,从而执行相应的操作
其判断的主要函数如下
'xslt的支持判断,Pattazl制作
function detectXSLT(detectPath)
if request.QueryString("nocookie")="Y" then
detectXSLT=false
else
if request.Cookies("enableXSLT")="" then
response.Cookies("enableXSLT")="YN"
quertstr=Request.ServerVariables("QUERY_STRING")
if quertstr<>"" then
redirStr=detectPath&"detectXSLT.asp?path="&server.URLEncode("http://"&Request.ServerVariables("HTTP_HOST")&Request.ServerVariables("URL")&"?"&quertstr)
else
redirStr=detectPath&"detectXSLT.asp?path="&server.URLEncode("http://"&Request.ServerVariables("HTTP_HOST")&Request.ServerVariables("URL"))
end if
response.Redirect(redirStr)
else
if request.Cookies("enableXSLT")="Y" then
detectXSLT=true
else
detectXSLT=false
end if
end if
end if
end function
使用方法:
首先下载我写的detectXSLT.rar,解压后把内容放到detectXSLT文件夹中
然后
<!--#include file="你的路径/detectXSLT/func.asp" -->
if detectXSLT("../detectXSLT/") then
' 如果支持xslt就用xml+xslt来显示
Server.Execute("XML.asp")
response.end
else
' 如果不支持xslt就用xhtml来显示
Server.Execute("XHTML.asp")
response.end
end if
最后分析:
本方法
优点:可以不受浏览器类型的限制,不需要js支持,对xslt的判断比较符合实际要求,即使不支持cookie也可以浏览,只是麻烦些
缺点:需要cookie的支持
具体可以查看这个http://www.yuhuatel.com/yang/news/detail.asp?id=1091页面