TreeNode 模板接收 Level 參數(預設 0),表示當前節點層級。核心變數:
NodeID:節點唯一 ID,優先取 @ID,否則用 generate-id(.)。注意:generate-id() 僅在單一 XML 文件內唯一,跨文件(多棵樹、動態載入)會重複,故演示程式在 TreeViewNodeXML.aspx 中使用 Guid.NewGuid() 手動指定 ID,確保全域唯一。ShowChildNode:$Level < 1 時為 1,控制初始化預設展開層數。ChildCount:count(Nodes/Node) 緩存子節點數,避免重複計算。HasChild:$ChildCount > 0 or string-length(XMLSource) > 0 判斷是否有子節點(含動態載入)。SkyTreeViewControl_line.gif 模擬垂直連線;輸出展開/摺疊圖示(_expend),onclick 綁定 SkyTreeViewControlExpendNodeByID,src/SrcBack 雙屬性實現圖示切換,區分「最後節點」與「非最後節點」四種狀態圖示。_child.gif / _lastchild.gif)。_icon):優先用節點 Icon 屬性,否則依 HasChild 與 ShowChildNode 顯示預設開合圖示(open.bmp/close.bmp),葉節點用 default.bmp。同樣綁定點擊展開事件。_text):<a class="SkyTreeViewControl_TreeNode">,綁定 onclick 展開/高亮、可選 href 與 OnClick 腳本,若有 XMLSource 寫入擴充屬性供動態載入使用。<xsl:if test="$ChildCount > 0">
<table id="{$NodeID}_table" style="{if $ShowChildNode != '1'}display:none{/if}">
<xsl:for-each select="Nodes/Node">
<xsl:call-template name="TreeNode">
<xsl:with-param name="Level" select="$Level + 1"/>
</xsl:call-template>
</xsl:for-each>
</table>
</xsl:if>
<xsl:if test="string-length(XMLSource) > 0">
<span id="{$NodeID}_Loading" style="display:none" class="SkyTreeViewControl_TreeNode">
<br/>正在載入<img src="..."/>
</span>
</xsl:if>
此模板完整實現了樹狀結構的遞迴渲染、視覺連接線模擬、展開狀態管理與動態載入基礎設施的預埋。