В настоящее время я пытаюсь преобразовать XML-файл в несколько выходных XML-файлов, взяв определенный его элемент и пройдя предков выбранных элементов.
Например:
Исходный XML:
<?xml version="1.0" encoding="utf-8"?>
<root>
<level_a>
<level_b>
<level_c>
<level_d>
<level_e/>
</level_d>
</level_c>
</level_b>
<level_b>
<level_c>
<level_d>
<level_e/>
</level_d>
</level_c>
</level_b>
<level_b>
<level_c>
<level_d>
<level_e/>
<level_e/>
<level_e/>
</level_d>
</level_c>
</level_b>
<level_b>
<level_c>
<level_d>
<level_d>
<level_e/>
</level_d>
</level_d>
</level_c>
</level_b>
</level_a>
</root>
Выходные XML-файлы:
1:
<output>
<output level="b">
<output level="c">
<output level="d">
<output level="e"/>
</output>
</output>
</output>
</output>
2:
<output>
<output level="b">
<output level="c">
<output level="d">
<output level="e"/>
</output>
</output>
</output>
</output>
3:
<output>
<output level="b">
<output level="c">
<output level="d">
<output level="e"/>
<output level="e"/>
<output level="e"/>
</output>
</output>
</output>
</output>
4:
<output>
<output level="b">
<output level="c">
<output level="d">
<output level="d">
<output level="e"/>
</output>
</output>
</output>
</output>
</output>
Я знаю, что могу что-то сделать в строке создания последовательности со следующим XPath:
(//level_d[not(level_d)])[last()]/ancestor::*[self::level_c|self::level_b]
а затем повторите его с помощью foreach, и я получу свои результаты в порядке документа.
Но что меня действительно интересует, так это то, как добиться того же, не прибегая к использованию foreach, любые решения, которые я могу придумать, вернут все элементы в обратном порядке...
Любая подсказка приветствуется
С наилучшими пожеланиями
Влакс
/*/*
и создать оттуда результирующий документ? - person Daniel Haley   schedule 05.06.2013match="/*/*"
наmatch="level_a/*"
в моем ответе, и он создаст 4 желаемых выходных файла с обновленным вводом XML, который вы предоставили. - person Daniel Haley   schedule 05.06.2013