分享
 
 
 

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

王朝other·作者佚名  2008-05-21
窄屏简体版  字體: |||超大  

动机:

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

材料:

XML卷之结构树图

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

讲解:

二叉树思路(1)

<htmlxmlns:v="urn:schemas-microsoft-com:vml"><STYLE>v:*{BEHAVIOR:url(#default#VML)}</STYLE><v:groupid="group1"name="group1"coordsize="100,100">…</v:group>

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

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

<FlowRoot><vcTitle>二叉树--结构图</vcTitle><Author>Sailflying</Author><Email>sailflying@163.net</Email><FlowNode><iProcess>1</iProcess><vcCourse>第一个节点</vcCourse><iNextYes><FlowNode><iProcess>2</iProcess><vcCourse>第二个节点</vcCourse><iNextYes>…</iNextYes><iNextNo>…</iNextNo></FlowNode></iNextYes><iNextNo><FlowNode><iProcess>3</iProcess><vcCourse>第三个节点</vcCourse><iNextYes>…</iNextYes><iNextNo>…</iNextNo></FlowNode></iNextNo></FlowNode></FlowRoot>

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

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

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

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

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

<xsl:templatematch="FlowNode">…<SCRIPTlanguage="javascript1.2">…alert('逐步显示');…</SCRIPT>…</xsl:template>

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

二叉树思路(2)

我的思路很简单:

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

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

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

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

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

也就是所有节点都遍历完毕,已经生成好了树。<xsl:templatematch="FlowNode">…<xsl:apply-templates/>…</xsl:template><xsl:templatematch="iNextYes"><xsl:apply-templatesselect="./FlowNode"/></xsl:template>

<xsl:templatematch="iNextNo"><xsl:apply-templatesselect="./FlowNode"/></xsl:template>

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

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

语法:

要依次匹配当前节点中的每个子节点的模板,应使用该元素的基本形式<xsl:apply-templates/>。否则,匹配的节点由select参数中XPath表达式的值决定,如<xsl:apply-templatesselect="./FlowNode"/>

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

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

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

(1)<xsl:value-ofselect="./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)<xsl:value-ofselect="./iProcess/text()"/>;

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

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

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

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

<xsl:apply-templatesselect="team"order-by="blue_ID"/>

比如我们想生成以下代码

<div名称=“参数值”>内容</div>

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

第一种写法是先加属性名称,再加参数值<div><xsl:attributename="name"><xsl:value-ofselect="./book/text()"/></xsl:attribute>内容</div>

第二种写法是直接加属性名称和参数值<divname="{./book/text()}">内容</div>

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

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

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有