婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > XML卷之實戰錦囊(5):結構樹圖

XML卷之實戰錦囊(5):結構樹圖

熱門標簽:本地電話機器人 東營電銷 高德地圖地圖標注服務中心 微信地圖標注合并了 南寧網絡外呼系統運營商 400電話辦理包年 如何修改多個百度地圖標注 r語言數據可視化地圖標注 隨州外呼調研系統

動機:
最初想起做二叉樹是因為需要做一個公司結構圖。 以前的做法都是直接用圖象軟件畫出來一個圖片。很好看,但每次有變動后都需要重新畫一個新的。 另一方面,網頁上對線條的顯示、布局相當局限。根據動態生成的數據進行排版、定位都相當困難, 而且在美觀上也差強人意。 做了各種嘗試以后,決定用XML+XSL作數據運算; 用VML來美化線條,用JAVASCRIPT來給對象定位。

材料:
XML卷之結構樹圖
有2個文件:flow2.xml 和 flow2.xsl 
效果:
瀏覽這里 
講解:
二叉樹思路(1)

html xmlns:v="urn:schemas-microsoft-com:vml">
STYLE>
v\:* { BEHAVIOR: url(#default#VML) }
/STYLE>
v:group id="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:template match="FlowNode">

SCRIPT language="JavaScript1.2">

alert('逐步顯示');

/SCRIPT>

/xsl:template>


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

 


二叉樹思路(2)
我的思路很簡單:
(1)讀取當前節點的資料,用VML生成一個新的對象。
給對象賦初始數值(如 name,id,style樣式等)
(2)用腳本控制來給當前對象定位
(3)當前節點和它的父親節點之間加箭頭,線條。
(4)繼續找當前節點的子節點,一直循環定位到結束。
也就是所有節點都遍歷完畢,已經生成好了樹。

 


xsl:template match="FlowNode">

xsl:apply-templates />

/xsl:template>
xsl:template match="iNextYes">
xsl:apply-templates select="./FlowNode" />
/xsl:template>

xsl:template match="iNextNo">
xsl:apply-templates select="./FlowNode" />
/xsl:template>

 

整個遞歸過程就是靠上面這三個模塊(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()}


這里定義了一些變量,節點的定位就是根據這些變量來調用運算公式的。

 

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)
連接線條的定位思路:
(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>
xsl:attribute name="name">
xsl:value-of select="./book/text()"/> /xsl:attribute>
內容
/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中用到中文的時候會報錯,原因就是沒有寫這個申明。

 


后記:
這里說的是一種思路。如果觸類旁通,自然能夠派上用場。 

您可能感興趣的文章:
  • Python構建XML樹結構的方法示例
  • 關于html嵌入xml數據島如何穿過樹形結構關系的問題
  • 一個很簡單的jquery+xml+ajax的無刷新樹結構(無css,后臺是c#)
  • Dom遍歷XML的一個例子,結果為樹狀結構
  • 簡單了解XML 樹結構

標簽:寧夏 拉薩 西雙版納 黃石 宿遷 果洛 益陽 德州

巨人網絡通訊聲明:本文標題《XML卷之實戰錦囊(5):結構樹圖》,本文關鍵詞  XML,卷之,實戰,錦囊,結構,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《XML卷之實戰錦囊(5):結構樹圖》相關的同類信息!
  • 本頁收集關于XML卷之實戰錦囊(5):結構樹圖的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日韩中字一区| 99国产精品国产精品久久| 五月天亚洲精品| 视频一区欧美日韩| 国产精品99久久久久久久女警 | 午夜精品久久久久久| 欧美日韩免费一区二区三区| 欧美mv和日韩mv国产网站| 一区二区三区四区在线| 日本成人在线网站| 一本大道久久a久久综合婷婷| 亚洲国产一二三| 91视频一区二区| 午夜伊人狠狠久久| 亚洲国产高清在线观看视频| 成人app网站| 韩国三级在线一区| 色偷偷一区二区三区| 亚洲天堂免费看| 日韩一区二区三| 成人手机在线视频| 国产原创一区二区三区| 国产精品久久久久影院亚瑟| 蜜臀久久99精品久久久久久9| 久久免费国产精品| 日本韩国欧美在线| 久久99热狠狠色一区二区| 国产精品日韩成人| 欧美日韩综合一区| 粉嫩13p一区二区三区| 国产女人18毛片水真多成人如厕| 美国三级日本三级久久99| 亚洲欧美日韩在线| 国产精品一区二区久激情瑜伽| 国产欧美久久久精品影院| 精品福利av导航| 一级女性全黄久久生活片免费| 国产精品系列在线观看| 欧美aaaaaa午夜精品| 亚洲一本大道在线| 亚洲欧美在线另类| 亚洲国产精品99久久久久久久久| 日韩亚洲电影在线| 日韩欧美一区二区不卡| 欧美日韩国产小视频| 91蜜桃在线免费视频| 不卡av电影在线播放| 风流少妇一区二区| 成人国产精品免费| 国产在线播放一区三区四| 青娱乐精品视频在线| 欧美福利电影网| 欧美一区二区高清| 97精品久久久午夜一区二区三区| 国产一区二区三区黄视频 | 在线91免费看| 欧美精品色一区二区三区| 成人手机电影网| 91丨九色丨国产丨porny| jlzzjlzz欧美大全| 成人国产视频在线观看| 性欧美大战久久久久久久久| 视频一区免费在线观看| 国产精品久久久久久久久搜平片| 欧美一区二区三区四区高清| 日韩手机在线导航| 国产午夜精品一区二区三区视频| www国产精品av| 成人h动漫精品一区二区| 欧美性色黄大片| 26uuu欧美日本| 亚洲精品视频一区二区| 久久av中文字幕片| 色综合久久久久久久久久久| 337p亚洲精品色噜噜| 久久影院午夜片一区| 久久五月婷婷丁香社区| 亚洲综合精品久久| 亚洲一区二区视频| 不卡av免费在线观看| 国产成人福利片| 欧美精品久久久久久久多人混战 | 国产在线精品一区二区| 精品中文av资源站在线观看| 色天使久久综合网天天| 国产成人福利片| 久久久不卡网国产精品二区| 国产精品一区在线| 欧美人牲a欧美精品| 欧美日韩中文另类| 欧美精品第1页| 成人av资源在线观看| 老鸭窝一区二区久久精品| 午夜欧美电影在线观看| 99久久夜色精品国产网站| 日韩电影在线观看电影| 亚洲男同性视频| 午夜影院久久久| 日日骚欧美日韩| 欧美夫妻性生活| 亚洲一区自拍偷拍| 成人丝袜18视频在线观看| 欧美在线综合视频| 中文字幕一区在线| 精品成人一区二区三区| 亚洲欧洲日本在线| 三级久久三级久久久| 欧美在线视频全部完| 色婷婷综合久久久中文一区二区| 亚洲一区视频在线观看视频| 99久久久国产精品免费蜜臀| 久久综合九色综合97婷婷| 成人黄动漫网站免费app| 欧美成人高清电影在线| 99re视频精品| 蜜桃久久久久久| 亚洲美女在线一区| 亚洲狠狠爱一区二区三区| 日韩精品久久久久久| 久久精品国产久精国产| 国产精品自拍三区| 国产成人午夜电影网| 欧洲色大大久久| 欧美一级欧美三级在线观看 | 日韩一区二区高清| 久久先锋影音av| 一区二区三区四区不卡视频| 亚洲线精品一区二区三区八戒| 日本不卡视频一二三区| 国产大陆a不卡| 奇米精品一区二区三区在线观看| 国产成人精品免费在线| 美女网站视频久久| 成人av电影免费在线播放| 欧美亚一区二区| 欧美激情综合五月色丁香 | 欧美电影免费观看高清完整版在线观看 | 日韩精品一区二区三区四区视频| 国产偷国产偷精品高清尤物| 水野朝阳av一区二区三区| 99久久精品免费看| 久久久亚洲高清| 亚洲成人三级小说| 国产福利精品一区| 欧美影院一区二区| 欧美成人艳星乳罩| 国产精品高清亚洲| 麻豆91在线播放免费| 欧美丝袜丝交足nylons| 久久久www免费人成精品| 亚洲不卡av一区二区三区| 亚洲人成电影网站色mp4| 国产成人午夜精品影院观看视频| 精品视频全国免费看| 欧美综合欧美视频| 亚洲裸体在线观看| 在线免费观看不卡av| 17c精品麻豆一区二区免费| 91精品国产综合久久久久| 日韩美女一区二区三区四区| 欧美激情艳妇裸体舞| 成人黄色国产精品网站大全在线免费观看 | aaa国产一区| 日韩欧美在线观看一区二区三区| 自拍偷拍欧美精品| 国产a区久久久| 日韩毛片视频在线看| 亚洲欧美视频一区| 亚洲成人精品一区二区| 麻豆精品视频在线| 国产一区二区美女诱惑| 91原创在线视频| 一区免费观看视频| 国产酒店精品激情| 欧美va亚洲va香蕉在线| 国产嫩草影院久久久久| 日韩激情一二三区| 日本vs亚洲vs韩国一区三区 | 亚洲电影在线播放| 欧美一区二区免费视频| 在线观看91精品国产入口| 7777女厕盗摄久久久| 欧美不卡视频一区| 免费av成人在线| 欧美一级国产精品| 国产美女主播视频一区| 国产精品网站在线播放| 91美女视频网站| 亚洲图片欧美视频| 国产精品久久午夜夜伦鲁鲁| 欧美日韩视频在线观看一区二区三区 | 色婷婷精品久久二区二区蜜臀av| 国产精品污www在线观看| 丁香一区二区三区| 亚洲天堂免费在线观看视频| 在线观看欧美黄色| 国产不卡视频在线播放| 日韩激情在线观看| 91精品国产免费| 91女人视频在线观看|