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 に答える