level
パスを表す要素に基づいて、フラットな XML からネストされた階層を作成しようとしています。各level
要素とそれに属する兄弟 (名前と番号は異なります) は、'record' 要素でラップして、ツリー構造を作成する必要があります。
このソースから(簡略化):
<?xml version="1.0" encoding="UTF-8"?>
<record>
<level>first</level>
<unitid>0001</unitid>
<a-few-more-siblings/>
<level>first/second</level>
<unitid>0002</unitid>
<many-more-siblings/>
<level>first/second/third</level>
<unitid>0003a</unitid>
<some-more-siblings/>
<level>first/second/third</level>
<unitid>0003b</unitid>
<many-more-siblings/>
<level>first/second/third</level>
<unitid>0003c</unitid>
<some-more-siblings/>
<level>first</level>
<unitid>0004</unitid>
<again-more-siblings/>
</record>
次の目的の出力を生成したいと思います。
<Record level="first">
<level>first</level>
<unitid>001</unitid>
<a-few-more-siblings/>
<Record level="second">
<level>second</level>
<unitid>002</unitid>
<many-more-siblings/>
<Record level="third">
<level>third</level>
<unitid>003a</unitid>
<some-more-siblings/>
</Record>
<Record level="third">
<level>third</level>
<unitid>003b</unitid>
<many-more-siblings/>
</Record>
<Record level="third">
<level>third</level>
<unitid>003c</unitid>
<some-more-siblings/>
</Record>
</Record>
</Record>
<Record level="first">
<level>first</level>
<unitid>0004</unitid>
<again-more-siblings/>
</Record>
これまでに作成できた最も近いものは次のとおりです。
<record level="first">
<level>first</level>
<unitid>0001</unitid>
<some-other-siblings/>
<record level="second">
<level>first/second</level>
<unitid>0002</unitid>
<some-other-siblings/>
<record level="third">
<level>first/second</level>
<unitid>0002</unitid>
<some-other-siblings/>
<level>first/second/third</level>
<unitid>0003a</unitid>
<some-other-siblings/>
</record>
<record level="third">
<level>first/second</level>
<unitid>0002</unitid>
<some-other-siblings/>
<level>first/second/third</level>
<unitid>0003a</unitid>
<some-other-siblings/>
<level>first/second/third</level>
<unitid>0003b</unitid>
<some-other-siblings/>
</record>
<record level="third">
<level>first/second/third</level>
<unitid>0003c</unitid>
<some-other-siblings/>
</Record>
</record>
</record>
(第 3 レベルの望ましくない兄弟はさらにインデントされます。0004
第 1 レベルでは表示されません)
同様の問題に対して提案されたアプローチのさまざまなバリエーション(「フラットから階層へ」、「兄弟をフォローする」など)を試しましたが、特定の位置に印刷された兄弟が多すぎるか、最初のレコードのみの出力で立ち往生しました。 3 番目のレベルで。
どんな助けでも大歓迎です。