最近我在做一个项目,项目计划采取XML+XSLT解决数据和显示模板的分离问题,这样不同的用户可以选择不同的页面显示模板。
兼顾到netscape浏览器,不直接输出xml,而是使用Jakarta的XSL taglib,这样通过这个taglib,将xml和xslt转换成html输出到浏览器端。
原来觉得这个方案在技术先进性方面,至少五年内是先进的。
但是在具体实施时,发现XML对存储html语法的文本有一定的限制,首先它要求必须是well-formed html,也就是符合XHTML语法的html,如有<br>必须要有</br>,否则XML分析器会报错。
这个问题可以使用Jtidy语法校正器来解决,Jtidy类似Tidy,在soourceforge.net上有下载,很好用,可以自动校正html中不规范的语法。
校正器解决后,就是XSLT对包含html语法的XML元素显示问题,这个可以通过xsl:copy-of 和xsl:template来解决,如:
<xsl:template match="html">
<xsl:copy-of select="*|text()"/>
</xsl:template>
<xsl:template match="book">
<tr>
<td>
<xsl:value-of select="title"/>
</td>
<td>
<xsl:apply-templates select="description"/>
</td>
</tr>
</xsl:template>
就在即将认为大功告成时,又出现致命问题:
项目中,这个带html语法的文本是由用户从form表单中输入,由于我采用了Castor技术,实现了O/R Map功能,但是Castor在存储html语法的文本时,自动将"<"符号转换成 <符号。
这样,上面准备的解决方案无用武之地了。
那就寻找XSLT如何将xml中元素包含 <的能直接变成html语法<输出,而不是文本形式的< 这个问题的解决似乎比较复杂,从国外deja新闻组的方案来看,书写很复杂。
至此,准备更换项目计划,显示不再使用xslt,而是使用Jsp解决,也就是实用XML+Jsp代替XML+XSLT
这样做有几个好处:
1.避免对Xslt不熟悉带来项目的技术风险,因为Xslt还在完善中的一个新技术,其实用性有待于考察和完善以及优化,就如一个简单html语法处理,变得很复杂,这不是普及性语言所具备的特征。
2.由于Jsp实际是html,这样可以让网页设计者直接通过dreamnwaver等设计工具方便设计出网页,不必想实用Xslt方案还要对html进行Xslt转换。节约工作量和成本。
3.Jsp技术也是一个新的技术,在技术先进性方面不会很落后于XSLT,只是兼容性方面差点,但是我们项目中间件基本是Java系统的,所以这个问题不是问题,更主要的是,使用Jsp,我们就可以使用J2EE的MVC架构来完成这个项目。
做一个模板Servlet控制程序,用来提供对不同用户适时更换不同的显示模板,这个配置是通过XML完成。这可以参考petstore的Servelt及其配置文件,这样可操作性大大增强,技术风险降低。