2012-07-27 74 views
1

我的問題如下:在包含節點和邊的結構中,我想添加邊以訪問所有節點。輸入可能是一些 東西一樣:使用XSLT 2.0添加圖形邊緣/引用

<graph> 
    <item id="1" type="entry"> 
    </item> 
    <item id="2" type="incoming"> 
    </item> 
    <item id="3" type="incoming"> 
    </item> 
    <item id="4" type="body"> 
     <connection>6</connection> 
    </item> 
    <item id="5" type="declaration"></item> 
    <item id="6" type="contents"> 
     <connection>7</connection> 
    </item> 
    <item id="7" type="contents"> 
     <connection>8</connection> 
    </item> 
    <item id="8" type="contents"></item> 
</graph> 

正如你可以看到有不會對所有的元素一個完整的「連接」 - 路徑。路徑應該通過訪問(按給定順序)完成,所有 @ type ='incoming',all @ type ='declaration'和finaly @ type ='body'將所有其他連接保持原樣。像:

<graph> 
    <item id="1" type="entry"> 
     <connection>2</connection> 
    </item> 
    <item id="2" type="incoming"> 
     <connection>3</connection> 
    </item> 
    <item id="3" type="incoming"> 
     <connection>5</connection> 
    </item> 
    <item id="4" type="body"> 
     <connection>6</connection> 
    </item> 
    <item id="5" type="declaration"> 
     <connection>4</connection> 
    </item> 
    <item id="6" type="contents"> 
     <connection>7</connection> 
    </item> 
    <item id="7" type="contents"> 
     <connection>8</connection> 
    </item> 
    <item id="8" type="contents"></item> 
</graph> 

我不知道如何實現,因爲我將不得不「記住」我訪問過的節點。是否有可能使用XSLT-2.0? 感謝您的幫助!

p.s.這些項目不一定按上面的id排序。

回答

1

「記住」已經訪問過哪些節點是通過使用遞歸模板調用並傳遞累積已訪問節點的節點集(或序列)的參數完成的。 XSLT 2.0使得使用序列和設置操作更容易,但XSLT 1.0可以很好地完成這項工作。

參見xslt to skip already "visited" nodes作爲示例實現。

+0

這是一個很好的方法!謝謝 :) – milnet 2012-07-27 15:39:26