Я получил хороший опыт работы с STX ( Потоковые преобразования для XML ). По сути, это потоковая версия XSLT, хорошо подходящая для анализа огромных объемов данных с минимальным использованием памяти. Он имеет реализацию в Java с именем Joost .
Должно быть легко придумать преобразование STX, которое игнорирует все элементы, пока элемент не соответствует заданному XPath, копирует этот элемент и все его дочерние элементы (используя шаблон идентичности в группе шаблонов) и продолжает игнорировать элементы до тех пор, пока следующий матч.
UPDATE
Я взломал STX-преобразование, которое делает то, что, как я понимаю, вы хотите. В основном это зависит от функций только STX, таких как группы шаблонов и настраиваемые шаблоны по умолчанию.
<stx:transform xmlns:stx="http://stx.sourceforge.net/2002/ns"
version="1.0" pass-through="none" output-method="xml">
<stx:template match="element/child">
<stx:process-self group="copy" />
</stx:template>
<stx:group name="copy" pass-through="all">
</stx:group>
</stx:transform>
pass-through="none"
в stx:transform
настраивает шаблоны по умолчанию (для узлов, атрибутов и т. Д.), Чтобы не выводить, а обрабатывать дочерние элементы. Затем stx:template
соответствует XPath element/child
(это место, в которое вы помещаете выражение соответствия), оно «обрабатывает себя» в группе «copy», что означает, что соответствующий шаблон из group name="copy"
вызывается в текущий элемент. Эта группа имеет pass-though="all"
, поэтому шаблоны по умолчанию копируют свои входные данные и обрабатывают дочерние элементы. Когда элемент element/child
заканчивается, управление передается обратно в шаблон, который вызвал process-self
, и следующие элементы снова игнорируются. Пока шаблон не совпадет снова.
Ниже приведен пример входного файла:
<root>
<child attribute="no-parent, so no copy">
</child>
<element id="id1">
<child attribute="value1">
text1<b>bold</b>
</child>
</element>
<element id="id2">
<child attribute="value2">
text2
<x:childX xmlns:x="http://x.example.com/x">
<!-- comment -->
yet more<b i="i" x:i="x-i" ></b>
</x:childX>
</child>
</element>
</root>
Это соответствующий выходной файл:
<?xml version="1.0" encoding="UTF-8"?>
<child attribute="value1">
text1<b>bold</b>
</child><child attribute="value2">
text2
<x:childX xmlns:x="http://x.example.com/x">
<!-- comment -->
yet more<b i="i" x:i="x-i" />
</x:childX>
</child>
Необычное форматирование является результатом пропуска текстовых узлов, содержащих символы новой строки вне элементов child
.