ITPub博客

首页 > 应用开发 > IT综合 > XML卷之实战锦囊(5)结构树图(转)

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

原创 IT综合 作者:amyz 时间:2007-08-12 15:02:09 0 删除 编辑
XML卷之实战锦囊(5)结构树图(转)[@more@]

  动机:

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

  材料: 

  XML卷之结构树图

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

  讲解: 

  二叉树思路(1) 

  …

  以上这些都是VML的基本格式,我就不详细讲解了。

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

  二叉树--结构图Sailflyingsailflying@163.net1第一个节点2 第二个节点… …  3 第三个节点… …  

  逻辑上很简单,当前节点(1)下面有两个子节点(2,3)。

  只需要将节点2和节点3定位在节点1的左下方和右下方就可以了。

  这里我将左右节点的连接线分别用了绿色和红色,方便显示。

  前面我们说到了XSL的递归功能,为了更清楚的看到每一个详细的

  显示步骤,只需要仿照下面的代码,加一个alert语句就可以了。

  …javascript1.2">…alert('逐步显示');……

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

  二叉树思路(2) 

  我的思路很简单:

  (1)读取当前节点的资料,用VML生成一个新的对象。

  给对象赋初始数值(如 name,id,style样式等)

  (2)用脚本控制来给当前对象定位

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

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

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

  

  整个递归过程就是靠上面这三个模块(template)来完成的。

  第一个template在匹配当前节点中每一个子节点的模板的时候调用了后面两个template; 而后面两个template又在具体执行的时候调用了第一个template ,这就相当于一个递归函数。

  语法:

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

  (1)和(2)的作用都是返回由 select 参数给出的表达式的字符串值。

  他们的搜索条件相同,所以返回的值也一样。

  只不过是使用的场合不同,他们的书写形式也就不一样。

  (1) value-of select="./iProcess/text()" />

  (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 + 当前节点的宽度 

  讲解: 

  1)flow2.xml 是数据文件,相信大家都不会有问题。

  2)flow2.xsl  是格式文件,有几个地方要注意。 

  (1)脚本中:

  (1) value-of select="./iProcess/text()" /> ;

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

  (1)和(2)的作用都是返回由 select 参数给出的表达式的字符串值。

  他们的搜索条件相同,所以返回的值也一样。

  只不过是使用的场合不同,他们的书写形式也就不一样。

  

  比如我们想生成以下代码

  内容

  我们假设名称为“name”,参数值为XML数据中当前节点下面的子节点book的值

  第一种写法是先加属性名称,再加参数值

value-of select="./book/text()"/> 内容 

  第二种写法是直接加属性名称和参数值内容

  具体的使用你可以看我写的代码中的例子。 

  XSL在正式的 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 的标准里value-of select="./book/text()"/> 

  作用是:只是把他的文本值写出来,而 value-of select="./book"/>

  在大多的XML教科书中所显示的代码中很少会加上encoding= "gb2312" ,

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10752019/viewspace-950203/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 论Asp与XML的关系(转)
下一篇: XML卷之实战锦囊(3)动态分页(转)
请登录后发表评论 登录
全部评论

最新文章