<Home>

关于XML+XSLT的一点记录

“似水柔情”惯了,冷不丁来点“学术”的东西还真有点别扭。不过时不时学点新东西对我来说也算是一种娱乐了。

HTML+CSS是把样式定义从内容结构中分离了出去,而xml+xslt则是彻底把结构、样式和内容分开来了。XML存储内容,XSLT定义结构和解释在浏览器中显示的样式。这样做对于我这种发布静态页面而又经常想改改显示样式的人来数实在是太帅了,所以我就斗胆冒着死猪不怕开水烫的精神,凭着仅有的一点点知识开始学习xml+xslt去了。

经过一段时间的学习我琢磨的问题大体有这么几个:

  1. XML+XSLT的SEO效果如何?

    研究的结论是没有结论。因为我太不了解SEO了,搜索了一圈发现有的人说对搜索引擎来说xml更友好,有的说还是html更友好……算了,我只是打算做记录而已不需要对搜索引擎示好,甚至收不收录我都不在乎,所以没研究出来也就不研究了吧。

  2. XSLT的缓存问题。

    XML+XSLT的好处主要是把数据和样式彻底分离。成千上万的XML文件都只调用一个XSLT文件来解释表现样式。这样做当然是为了让访问者下载的数据最小化从而缩短页面加载时间。但是我不知道,浏览器访问页面时是不是把XSLT文件缓存下来呢。如果不缓存,那么实际上会比访问HTML+CSS页面下载更多数据。

  3. 内容格式化表现。

    主要就是牵扯到解释<![CDATA[ ]]>标签内的内容为HTML。对于IE、Opera、Safari/Chrome都好说,把disable-output-escaping属性设置成“yes”就可以了。但是firefox却不支持这个属性,所以需要特殊处理。在网上搜索到一种用JS来实现的:

<script language="JavaScript">
   1:     var escaping=function(){
   2:     if(!document.getElementById){ return false;}
   3:     var interim;
   4:     var temp = document.getElementsByTagName("span");
   5:     var tempLen = temp.length;
   6:     var pattern = new RegExp("(^|\\s)tohtml(\\s|$)");
   7:     for (i = 0; i &lt; tempLen; i++) {
   8:     if ( pattern.test(temp[i].className) ) {
   9:     interim = temp[i].textContent;
  10:     if(interim == undefined || (interim.indexOf("&amp;") == -1 &amp;&amp; interim.indexOf("&lt;") == -1)){/*_*/}
  11:     else{temp[i].innerHTML = interim;}
  12:     }
  13:     }http://www.dimlau.com
  14:     temp=null;
  15:     };
  16:     window.load = escaping();
</script>

试了一下果然管用,话说,原来Firefox也不好伺候啊。

如果能确保内容完全符合xHTML标准,其实不必使用<![CDATA[ ]]>标签来包裹内容。这样输出的时候可以更简单地表现为html样式,这招是我在看XSLT元素手册的时候自己猜的,试了一下果然有效,而且各浏览器都支持,我相当滴有成就感:

<xsl:copy-of select="node()"/>

不过这样做就要求XML里的内容必须完全符合规范,比如贴图代码<img src=”” />的斜杠我就经常漏掉,万一漏掉,页面就无法打开了。

大概就是这样子了,其实这篇文章我早在上周二就已经写好了,之所以一直没有发布是因为我自己一直没有做出个演示页面来。一直瞎忙活着拖啊拖啊,今天才捡了个比较简单的页面做出来。给个演示:http://www.dimlau.com/ing/

恩,凑合着看看吧,很多地方不完善。而且原来我的ING动态是使用SSI服务器端引用到我的站点首页的,现在变成了xml数据,如果还想引用就要用到JS了。我讨厌(因为不会)JS。

欢迎反馈一下各浏览器的效果。另外,我blog的留言订阅功能以前是不能用的,昨天刚刚换了个插件,希望热心人帮我测试一下可不可以用。谢谢。

fin.

页面会变得很长么?期待。

wayne 2008-12-09,05:01 says: “回复”

firefox 3.0.4 ok...
顺便跟踪一下评论

fei 2008-12-09,08:22 says: “回复”

技术贴。留名。
我主要目的是为了跟踪评论。

dimlau 2008-12-09,10:34 says: “回复”

感谢楼上二位
顺便祝1楼的旅行愉快~嫉妒中

dimlau 2008-12-09,12:33 says: “回复”

看来……插件又失败了?

Yacca 2008-12-09,13:39 says: “回复”

对技术这不在行...还是关注开心有趣.

dimlau 2008-12-09,14:54 says: “回复”

我也就是瞎折腾一下,我家开心比这些洋字码有意思多了
呵呵

wayne 2008-12-09,15:34 says: “回复”

gxgx, 这次插件工作了 :D

dimlau 2008-12-09,19:53 says: “回复”

我也试了一下,退订链接好像错了

fei 2008-12-09,15:35 says: “回复”

我突然响起了星际争霸2的官网

dimlau 2008-12-09,19:54 says: “回复”

我得去学学他怎么用js调用数据的

aether 2008-12-17,11:54 says: “回复”

不错,主要的点都有了,不过XML本身没有语法可以在客户端组合,这个比较残念。

copy-of确实是最有效的一招。

xsl xml的缓存策略和其他静态文件是一样。

dimlau 2008-12-17,21:31 says: “回复”

话说您的Avalon(如果没记错名字的话)果然不再继续开发了么?

Aether 2008-12-17,23:54 says: “回复”

哎呀呀,我想可能需要等上一两年看看W3C那些老爷爷们啥时可以推进快一点吧!主要是本身的各种算法、支持以及终端的普及呀~