[摘要]4.4.构造显示树型结构的XSL模版在上面的demotree.xml,是不能单独显示出如图一一样的树结构的,需要把XML文件用XSL模版来转换。 在这里实际上需要把XML文档用模版格式为以下样式:&...
4.4.构造显示树型结构的XSL模版
在上面的demotree.xml,是不能单独显示出如图一一样的树结构的,需要把XML文件用XSL模版来转换。
在这里实际上需要把XML文档用模版格式为以下样式:
<ul>
<li></li>
<li></li>
<ul>
<li></li>
<li></li>
</ul>
</ul>
每一个li表示一个子节点,ul表示其上的li为一树杈,其下的li为其子节点,可能为树杈,可能为叶子,取决于该子节点是否具有ul。
XSL模版功能定义着如何转化嵌套的node节点为嵌套的ul和li表示。
模版转化的关键代码:
<xsl:template match="node">
<xsl:for-each select=".[number(layer) $eq$ 0 ]"><!—对于每一个节点,如果他的layer值为0,进行下面的代码变化-->
<xsl:if test=".[href $eq$ '']"><!—如果节点的href域为空,说明其为树杈,需要检索其下面的嵌套node-->
<xsl:element name ="li"><!—对于li标签,不仅仅是指定其id为goldheader,还指定其序号no为该节点的id值-->
<xsl:attribute name="id">foldheader</xsl:attribute>
<xsl:attribute name="no"><xsl:value-of select="id"/></xsl:attribute>
<xsl:value-of select="value"/>
</xsl:element>
……
</xsl:if>
<xsl:if test=".[href $ne$ '']"> <!—如果节点的href域不为空,说明其为叶子,转换为li格式,并把链接,目标框架,显示字符串的值以超链接的形式显示出来-->
<li><xsl:element name ="a">
<xsl:attribute name="HREF">
<xsl:value-of select="href"/>
</xsl:attribute>
<xsl:attribute name="TARGET">
<xsl:value-of select="target"/></xsl:attribute>
<xsl:value-of select="value"/>
</xsl:element>
</li>
</xsl:if>
</xsl:for-each>
</xsl:template>
因为浏览器对XSL支持的不同,所以在目前的浏览器使用比例上言,MSIE是可以作为默认浏览器标准来定义的,在不安装MSXSL3的情况下,MSIE只是支持XSL2,对XSL变量等不支持,所以,在这里的实现过程中以嵌套的代码来实现替换变量实现的效果。整体的代码比较冗长,但易于读写和修改。不对代码进行重复,具体请参见treefunc.xsl文件中从<xsl:template match="node">开始到</xsl:template>结束的中间的代码实现。
树状显示还依赖于js的支持,js定义着点击树杈时树的显示变化,例如,当当前点击树杈节点为收缩状态时,点击的效果是展开该树杈,显示树杈的下级节点,反之亦然。
首先对ul和li进行类的标识,对于树杈的li,定义其元素的id为’ foldheader’,对于其下跟随的ul定义其元素的id为’ foldinglist’,style.display为’none’或者’’,然后定义一个change函数,功能为点击树杈节点后的界面变化。
同时因为树结构的层次可能会比较深,需要考虑到客户浏览时,在刷新页面或者重新开启同一页面时应该保存住客户最后浏览的树的层次,在这里实现的方式是用cookie保持每个树杈的是否展开的布尔值,
对cookie的操作函数和对点击事件的操作函数都在treefunc.xsl文件中,下面是javascript编写的对XML生成树进行HTML动作处理的方法,
/*说明是在载入页面时就要发生的动作*/
var temp_str = 'thexmltreecookie';/*定义一个字符串,用于在cookie中查找节点展开状态*/
var fl_n = 0;
temp_str = temp_str + "=";
for (i=0;i<foldinglist.length;i++){/*把所有的树杈都预设为未展开,并统计个数*/
temp_str=temp_str+"0:";
}
temp_str = temp_str.substring(0,temp_str.length-1);
fl_n = temp_str.length -17 ;
if ((document.cookie == '')
关键词:用Java完成可保存状态的数据库生成XML树(3)