XML卷之实战锦囊(5):结构树图
|
源代码网整理以下最初想起做二叉树是因为需要做一个公司结构图。 以前的做法都是直接用图象软件画出来一个图片。很好看,但每次有变动后都需要重新画一个新的。 另一方面,网页上对线条的显示、布局相当局限。根据动态生成的数据进行排版、定位都相当困难, 而且在美观上也差强人意。 做了各种尝试以后,决定用XML+XSL作数据运算; 用VML来美化线条,用JAVASCRIPT来给对象定位。 源代码网整理以下材料: 源代码网整理以下XML卷之结构树图 源代码网整理以下有2个文件:flow2.xml 和 flow2.xsl 源代码网整理以下讲解: 源代码网整理以下二叉树思路(1) 源代码网整理以下
源代码网整理以下以上这些都是VML的基本格式,我就不详细讲解了。 源代码网整理以下XML是树型结构,我们读取每个数据就需要对这个XML数据树进行遍历。而递归运算是XSL优势之一。我也是在用其它多种方法进行遍历运算失败后才决定使用XSL的。 源代码网整理以下
源代码网整理以下逻辑上很简单,当前节点(1)下面有两个子节点(2,3)。只需要将节点2和节点3定位在节点1的左下方和右下方就可以了。这里我将左右节点的连接线分别用了绿色和红色,方便显示。 源代码网整理以下前面我们说到了XSL的递归功能,为了更清楚的看到每一个详细的显示步骤,只需要仿照下面的代码,加一个alert语句就可以了。 源代码网整理以下
源代码网整理以下二叉树思路(2) 源代码网整理以下我的思路很简单: 源代码网整理以下(1)读取当前节点的资料,用VML生成一个新的对象。给对象赋初始数值(如 name,id,style样式等) 源代码网整理以下(2)用脚本控制来给当前对象定位 源代码网整理以下(3)当前节点和它的父亲节点之间加箭头,线条。 源代码网整理以下(4)继续找当前节点的子节点,一直循环定位到结束。 源代码网整理以下也就是所有节点都遍历完毕,已经生成好了树。 源代码网整理以下
源代码网整理以下整个递归过程就是靠上面这三个模块(template)来完成的。第一个template在匹配当前节点中每一个子节点的模板的时候调用了后面两个template; 而后面两个template又在具体执行的时候调用了第一个template ,这就相当于一个递归函数。 源代码网整理以下语法: 源代码网整理以下要依次匹配当前节点中的每个子节点的模板,应使用该元素的基本形式 <xsl:apply-templates />。否则,匹配的节点由 select 参数中 XPath 表达式的值决定,如 <xsl:apply-templates select="./FlowNode" /> 源代码网整理以下(1)和(2)的作用都是返回由 select 参数给出的表达式的字符串值。他们的搜索条件相同,所以返回的值也一样。只不过是使用的场合不同,他们的书写形式也就不一样。 源代码网整理以下(1) <xsl:value-of select="./iProcess/text()" /> 源代码网整理以下(2) { ./iProcess/text()} 源代码网整理以下这里定义了一些变量,节点的定位就是根据这些变量来调用运算公式的。 源代码网整理以下
源代码网整理以下叶子:是指当前节点没有子节点 源代码网整理以下节点的定位公式: 源代码网整理以下(1) 当前节点是根节点 源代码网整理以下
源代码网整理以下(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) 源代码网整理以下连接线条的定位思路: 源代码网整理以下(1)找到当前节点和父节点的位置 源代码网整理以下(2)判断当前节点是父节点的左边子节点,还是右边子节点 源代码网整理以下(3)画线条 源代码网整理以下这里定义了一些变量。 源代码网整理以下objOval //当前节点,是一个object 源代码网整理以下objParentOval //当前对象的父节点,是一个object 源代码网整理以下objLine //当前线条,是一个object 源代码网整理以下线条的定位公式: 源代码网整理以下from="x1,y1" to="x2,y2" 是 VML 里定位线条的方式 源代码网整理以下当前节点是父节点的左边子节点,则公式为: 源代码网整理以下from = 父节点的left + 偏移量(15) , 父节点的top + 偏移量(32) 源代码网整理以下to = 父节点的left + 偏移量(30) , 父节点的top - 偏移量(2) 源代码网整理以下当前节点是父节点的右边子节点,则公式为: 源代码网整理以下from = 父节点的left + 偏移量(35) ,父节点的top + 偏移量(32) 源代码网整理以下to = 父节点的left + 偏移量(20) ,父节点的top - 偏移量(2) 源代码网整理以下我所能想到的也就这么多了。 源代码网整理以下如果只是单纯的做一个公司结构图的话,会更简单很多。下面是赛扬的思路,我也是在他的基础上深入一点而已。 源代码网整理以下首先计算最下层节点个数,得出宽度,然后应该根据节点的从属关系计算其上层节点位置,递归。 源代码网整理以下每一层级的节点要按从属关系先排序首先设“基本值”=节点应向右偏移量每个包含子节点的节点的left值等于它所拥有的节点所占宽度的一半加上基本值 源代码网整理以下后话: 源代码网整理以下最近不知为何,网络一直都不好。断线的时间比在线的时间多。所以没对代码简化,其实,要完善的功能还有很多,比如:需要加右键菜单 源代码网整理以下右键菜单内含新建节点、修改节点名称、改变关联关系等 源代码网整理以下在每一个节点上都可右键打开这个节点的右键菜单 源代码网整理以下讲解: 源代码网整理以下1)flow2.xml 是数据文件,相信大家都不会有问题。 源代码网整理以下2)flow2.xsl 是格式文件,有几个地方要注意。 源代码网整理以下(1)脚本中: 源代码网整理以下(1) <xsl:value-of select="./iProcess/text()" /> ; 源代码网整理以下(2) { ./iProcess/text()} 源代码网整理以下(1)和(2)的作用都是返回由 select 参数给出的表达式的字符串值。他们的搜索条件相同,所以返回的值也一样。只不过是使用的场合不同,他们的书写形式也就不一样。 源代码网整理以下<xsl:apply-templates select="team" order-by="blue_ID"/> 源代码网整理以下比如我们想生成以下代码 源代码网整理以下<div 名称=“参数值”>内容</div> 源代码网整理以下我们假设名称为“name”,参数值为XML数据中当前节点下面的子节点book的值 源代码网整理以下第一种写法是先加属性名称,再加参数值 源代码网整理以下
源代码网整理以下内容 源代码网整理以下</div> 源代码网整理以下第二种写法是直接加属性名称和参数值 源代码网整理以下<div name="{ ./book/text()}">内容</div> 源代码网整理以下具体的使用你可以看我写的代码中的例子。 源代码网整理以下XSL在正式的 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 的标准里 源代码网整理以下<xsl:value-of select="./book/text()"/> 源代码网整理以下作用是:只是把他的文本值写出来,而 源代码网整理以下<xsl:value-of select="./book"/> 源代码网整理以下是把他的文本值和他的所有子节点的内容显示出来。 源代码网整理以下大家可以试验一下,输出一个有子节点的,一个无子节点的看看显示的结果是否相同。 源代码网整理以下(2)需要注意: 源代码网整理以下IE5 不支持 <tag att="{ xpath}"> 源代码网整理以下要用 源代码网整理以下<tag><xsl:attribute name="att"><xsl:value-of select="xpath"></xsl:attribute> 源代码网整理以下命名空间要用 源代码网整理以下xmlns:xsl="http://www.w3.org/TR/WD-xsl" 源代码网整理以下<?xml version="1.0" encoding="gb2312" ?> 源代码网整理以下另外说一点: 源代码网整理以下在大多的XML教科书中所显示的代码中很少会加上encoding="gb2312" ,因此我们在XML中用到中文的时候会报错,原因就是没有写这个申明。 源代码网供稿. |
