热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

XML卷之实战锦囊(5):结构树图

最初想起做二叉树是由于需要做一个公司结构图。以前的做法都是直接用图象软件画出来一个图片。很好看,但每次有变动后都需要重新画一个新的。另一方面,网页上对线条的显示

最初想起做二叉树是由于需要做一个公司结构图。 以前的做法都是直接用图象软件画出来一个图片。很好看,但每次有变动后都需要重新画一个新的。 另一方面,网页上对线条的显示、布局相当局限。根据动态天生的数据进行排版、定位都相当艰苦, 而且在雅观上也差能人意。 做了各种尝试以后,决定用XML XSL作数据运算; 用VML来美化线条,用Javascript来给对象定位。

材料:

XML卷之结构树图

有2个文件:flow2.xml 和 flow2.xsl

讲解:

二叉树思路(1)

以下为引用的内容:




以上这些都是VML的基础格局,我就不具体讲解了。

XML是树型结构,我们读取每个数据就需要对这个XML数据树进行遍历。而递回运算是XSL上风之一。我也是在用其它多种方法进行遍历运算失败后才决定应用XSL的。

以下为引用的内容:


二叉树--结构图
Sailflying
sailflying@163.net

1
第一个节点


2
第二个节点






3
第三个节点





逻辑上很简略,当前节点(1)下面有两个子节点(2,3)。只需要将节点2和节点3定位在节点1的左下方和右下方就可以了。这里我将左右节点的连接线分辨用了绿色和红色,方便显示。

前面我们说到了XSL的递回功效,为了更明白的看到每一个具体的显示步骤,只需要仿照下面的代码,加一个alert语句就可以了。

以下为引用的内容:





alert('逐步显示');

《SCRIPT》

看了上面的慢动作,是否能让大家懂得到我的思路。

二叉树思路(2)

我的思路很简略:

(1)读取当前节点的材料,用VML天生一个新的对象。给对象赋初始数值(如 name,id,style样式等)

(2)用脚本把持来给当前对象定位

(3)当前节点和它的父亲节点之间加箭头,线条。

(4)持续找当前节点的子节点,一直循环定位到结束。

也就是所有节点都遍历完毕,已经天生好了树。

以下为引用的内容:










全部递回过程就是靠上面这三个模块(template)来完成的。第一个template在匹配当前节点中每一个子节点的模板的时候调用了后面两个template; 而后面两个template又在具体履行的时候调用了第一个template ,这就相当于一个递回函数。

语法:

要依次匹配当前节点中的每个子节点的模板,应应用该元素的基础情势 。否则,匹配的节点由 select 参数中 XPath 表达式的值决定,如

(1)和(2)的作用都是返回由 select 参数给出的表达式的字符串值。他们的搜索条件雷同,所以返回的值也一样。只不过是应用的场合不同,他们的书写情势也就不一样。

(1)

(2) { ./iProcess/text()}

这里定义了一些变量,节点的定位就是根据这些变量来调用运算公式的。

以下为引用的内容:

root_left //根的左边距=所有叶子的分配宽度(y*10) 所有叶子的宽度(y*50) 左边距基础值(10)
root_top //根的上边距=上边距基础值(10)
objOval //当前对象,是一个object
objOval_iProcess //当前对象的步骤值
objParentOval //当前对象的父节点,是一个object
objParentOval_iProcess //当前对象父节点的步骤值
objParent_name //当前对象父节点的名称
Leaf_left //当前对象的所有子节点中的左边叶子数
Leaf_right //当前对象的所有子节点中的右边叶子数
Leaf_sum //当前对象的所有子节点中叶子数

叶子:是指当前节点没有子节点

节点的定位公式:

(1) 当前节点是根节点

以下为引用的内容:

//根的地位
SobjOval.style.left=parseInt(root_left);
SobjOval.style.top=parseInt(root_top);
//parseInt() 函数的作用是取整数值,假如不是则为NAN
//isNaN()函数的作用是判定parseInt取得的是否为整数

(2)当前节点是父节点的左边子节点

1)判定的条件是:当前对象父节点的名称='iNextYes'

2)假如存在右边子叶子,则公式为:当前节点的left=父节点的left - 当前节点的右边子叶子的总宽度- 当前节点的宽度

3)假如不存在右边子叶子,但存在左边子叶子,则公式为:当前节点的left=父节点的left - 当前节点的左边子叶子的总宽度

4)假如当前节点本身就是叶子,则公式为:当前节点的left=父节点的left - 当前节点的宽度

(3)当前节点是父节点的右边子节点

1)判定的条件是: 当前对象父节点的名称='iNextNo'

2)假如存在左边子叶子,则公式为:

当前节点的left=父节点的left 当前节点的左边子叶子的总宽度 当前节点的宽度

3)假如不存在左边子叶子,但存在右边子叶子,则公式为:

当前节点的left=父节点的left 当前节点的右边子叶子的总宽度

4)假如当前节点本身就是叶子,则公式为:

当前节点的left=父节点的left 当前节点的宽度

(2)和(3)的公式都是得到当前节点的left,我们还需要得到当前节点的top很简略的公式:当前节点的top=父节点的top 偏移量(80)

二叉树思路(3)

连接线条的定位思路:

推荐阅读
author-avatar
蜕变爱宝女
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有