国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發 > XML > 正文

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

2024-09-05 20:54:14
字體:
來源:轉載
供稿:網友

最初想起做二叉樹是因為需要做一個公司結構圖。 以前的做法都是直接用圖象軟件畫出來一個圖片。很好看,但每次有變動后都需要重新畫一個新的。 另一方面,網頁上對線條的顯示、布局相當局限。根據動態生成的數據進行排版、定位都相當困難, 而且在美觀上也差強人意。 做了各種嘗試以后,決定用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中用到中文的時候會報錯,原因就是沒有寫這個申明。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
欧美高清xxxx性| 国产69精品久久久久孕妇国产69久久 | 国产高清免费av在线| 中文字幕中文字幕在线中高清免费版 | 国产h色视频在线观看| 国产卡1卡2卡三卡在线| 国产美女高潮| 国产视频青青| 亚洲永久免费网站| 最新av免费看| 一二三四区在线观看| 青青青青在线| 国产精品区一区二| 香蕉视频免费在线播放| 黄色毛片在线观看| 国产高清在线看| 免费看ww视频网站入口| 国产一二三区在线| 欧美成人精品福利网站| 国产精品外围在线观看| 国产视频二区在线观看| 亚洲an天堂an在线观看| 日本最新在线视频| 四虎一区二区三区| 国产一级免费在线观看| 亚洲www色| 97视频免费| 中文字幕在线视频免费观看| 毛片视频免费观看| 在线国产一级| 国产对白叫床清晰在线播放| 导航福利在线| 久久精品国产亚洲a∨麻豆| 在线播放av网站| 国产高清在线观看| 久久一本精品| 欧美日韩一区二区三区视视频| 2020中文字幕在线播放| 国产婷婷视频在线| 中文字幕在线看精品乱码| 色吊丝av中文字幕| eeuss在线观看| av亚洲男人天堂| 一本免费视频| 在线观看免费高清完整| 99re在线视频| www.九九热.com| 欧美日韩亚洲国内综合网| 轻轻色免费在线视频| www在线观看播放免费视频日本| 精品入口蜜桃| 在线看黄网址| 免费不卡中文字幕视频| 国产在线一二三| 豆国产97在线|亚洲| 黄网址在线永久免费观看| 高清av在线| 国产精品乱码一区二区三区视频| 天堂中文字幕在线| 国产偷窥洗澡视频| 精品电影在线| 免费a级毛片在线播放| 黄色一级视频网站| 国产亚av手机在线观看| 国产黄网站在线观看| 国产成免费视频| 亚洲精品一线| 国产亚洲精品久久久久久移动网络| 国产视频三区| 青青草中文字幕| 国产精品四虎| 免费在线黄色av| 国产精品日日爱| 久久香蕉一区| 9色在线视频网站| 91超碰国产在线| h视频在线网站| 97视频在线观看网站| 黄网站在线观看高清免费| 91亚洲欧美| 中中文字幕av在线| av网站大全在线| 国产精品久久在线| 久草电影在线| 小说区乱图片区| 伊人中文在线| 国产传媒在线播放| 国产视频福利在线| 2018av男人天堂| 国产精品一区二区三区四区色| av在线不卡网站| 在线观看av中文| 精品伦理一区二区| √8天堂资源地址中文在线| 国产精品㊣新片速递bt | 国产精品入口麻豆高清| 欧美国产中文| av在线天堂| 在线视频中文字幕久| 国产激情在线| 国产精彩视频在线观看免费蜜芽| 国产美女福利在线| 国产一区在线视频观看| 欧美日韩**字幕一区| av中文在线| 青青九九免费视频在线| www操操操| 黄网站在线观看高清免费| av丝袜在线| 欧美高清视频| 国产麻豆视频网站| 中文字幕一区二区三区免费视频| 国产情侣高潮对白| 在线观看av网站| 狠狠干在线视频| 中文字幕视频免费在线观看| 国产一卡2卡3卡4卡网站免费| 国产视频1区| 亚洲电影先锋| 超碰人人在线| 日韩av成人| 精品成人免费自拍视频| www.狠狠插| 国产女人在线观看| 91欧美在线视频| 狂野欧美性猛交xxxx乱大交| 91福利在线免费| av在线free| 国产三级免费观看| 啪啪免费视频一区| 国产啊啊啊视频在线观看| а√天堂www在线а√天堂视频| 欧美日韩**字幕一区| 国产一级在线观看www色| 亚洲综合在线免费| 国产香蕉视频在线观看| 人人九九精品| 精品国产高清a毛片无毒不卡 | av在线免费观看网| 国产久草在线| 美女国产在线| 亚洲精品在线播放视频| 国产精品久久久久一区二区国产| www网站在线观看| 91免费日韩| 国产欧美一区二区三区小说| 狠狠狠综合7777久夜色撩人| 国产黄色免费| 中文字幕免费中文| 国产卡二和卡三的视频| 免费黄色网页在线观看| 中文一区在线观看| 999福利在线视频| 国产高清视频在线播放| 中文字幕中文字幕在线中高清免费版 | 国产jizz| 69久久精品| 国产黄色免费在线观看| 国产午夜三区视频在线| 国产理论电影在线| 久久精品最新免费国产成人| av网址在线播放| av男人的天堂网| 在线a人片免费观看视频| 精品视频vs精品视频| 精精国产xxxx视频在线中文版| 国产成人精品综合网站| 国产精品臀控福利在线观看| 天天操人人干| 国产一级片网站| 国产91在线视频蝌蚪| 9999在线视频| 四虎影院成人| 成人超碰在线| 国产激情视频一区二区三区| 精品视频一二区| 美女av在线播放| 国产男女av| 18被视频免费观看视频| 亚洲视频手机在线观看| 国产在线色视频| 国产黄色在线| 精品街拍一区二区| 九九精品九九| 国产国语**毛片高清视频| 影音先锋在线中文字幕| 九九热视频在线观看| 国产精品18久久久久久久久久| 亚洲第一区视频| 国产九色porn网址| 亚洲欧美日韩一区成人| 国产鲁鲁视频在线观看免费| 国产二区视频在线观看| 欧美日韩亚洲国内综合网| 国产图片综合| 国内精品一区视频| 性色视频在线| 国产人成在线视频| 国产你懂的在线观看| 99久久国产视频|