2012-07-27 73 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