1

我的问题如下:在包含节点和边的结构中,我想添加边以访问所有节点。输入可能是这样的:

<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'、所有@type='declaration'和最后@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 可以实现类似的功能吗?谢谢你的帮助!

ps项目不一定按上面的id排序。

4

1 回答 1

1

通过使用递归模板调用并传递一个累积已访问节点的节点集(或序列)的参数来“记住”哪些节点已经被访问过。XSLT 2.0 使用序列和集合操作使这更容易,但 XSLT 1.0 可以做得很好。

有关示例实现,请参阅xslt 以跳过已“访问过”的节点

于 2012-07-27T15:30:36.373 回答