Вы можете использовать любой язык, который позволяет вам манипулировать XML напрямую. Я предлагаю найти что-то с DOM, а не SAX. Если вы используете SAX, вы должны сами пройтись по xml - мне кажется, лаваш. DOM позволяет вам работать с XML более ООП.
Что-то, что сразу приходит на ум, будет xml-оберткой вокруг ваших xml-документов.
Так что-то вроде:
<documents>
<document>
<!-- Your xml here -->
</document>
<document>
<!-- Your xml here -->
</document>
<document>
<!-- Your xml here -->
</document>
</documents>
Псевдокод будет:
Создать корень документа.
Добавьте элемент с именем Documents, используйте его в качестве корневого.
Итерируйте каждый из ваших XML-файлов.
Для каждого файла создайте новый элемент с именем document. Добавьте этот элемент к родителю. Загрузите XML из файла. Импортируйте этот узел во внешний документ. Добавьте импортированный узел в дочернюю коллекцию элементов документа.
EDIT
Как и было обещано, обновленный код был протестирован, и я знаю, что он работает:
<?php
// Replace the strings below with the actual filenames, add or decrease as fit
$filenames = array(0 => "test.xml", 1 => "test2.xml", 2 => "test3.xml" );
$docList = new DOMDocument();
$root = $docList->createElement('documents');
$docList->appendChild($root);
foreach($filenames as $filename) {
$doc = new DOMDocument();
$doc->load($filename);
$xmlString = $doc->saveXML($doc->documentElement);
$xpath = new DOMXPath($doc);
$query = "//product"; // this is the name of the ROOT element
$nodelist = $xpath->evaluate($query, $doc->documentElement);
if( $nodelist->length > 0 ) {
$node = $docList->importNode($nodelist->item(0), true);
$xmldownload = $docList->createElement('document');
$xmldownload->setAttribute("filename", $filename);
$xmldownload->appendChild($node);
$root->appendChild($xmldownload);
}
}
echo $docList->saveXML();
?>