Рассмотрим XSLT (родственный XPath), язык специального назначения, предназначенный для преобразования файлов XML в другие файлы XML, HTML и даже текстовые файлы.PHP может запускать сценарии XSLT 1.0 со своим классом php-xsl (обязательно включите его в файле .ini).
Для XML-файлов малого и среднего размера XSLT является производительным вариантом, поскольку вы даже избегаете циклов foreach
и логики if
и дерева перестроения (т. Е. importNode
) на уровне приложения.В частности, ниже XSLT анализирует до уровня ITEM и сопоставляет родительский SUBROOT необходимый элемент, используя XPath's ancestor::*
.Настройте в скрипте фактические имена узлов.
XSLT (сохранить как файл .xsl, специальный файл .xml)
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/ROOT">
<NEWROOT>
<xsl:apply-templates select="SUBROOT"/>
</NEWROOT>
</xsl:template>
<xsl:template match="SUBROOT">
<xsl:apply-templates select="ITEM"/>
</xsl:template>
<xsl:template match="ITEM">
<xsl:copy>
<xsl:copy-of select="ancestor::SUBROOT/MOVEME" />
<xsl:copy-of select="*"/>
</xsl:copy>
</xsl:template>
</xsl:transform>
PHP
# LOAD XML AND XSL FILES
$xml = new DOMDocument;
$xml->load('/path/to/input.xml');
$xsl = new DOMDocument;
$xsl->load('/path/to/xslt_script.xsl');
// CONFIGURE TRANSFORMER
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
// RUN TRANSFORMATION
$newXML = new DOMDocument;
$newXML = $proc->transformToXML($xml);
// OUTPUT NEW XML
echo $newXML;
// SAVE NEW DOM TREE TO FILE
file_put_contents('/path/to/output.xml', $newXML);
XSLT Demo