2016-08-04 26 views
0

Ich bin ein Neuling zu XML PHP und XPATH.Kopieren Sie einen XML-Knoten zu einem anderen Knoten

Ich habe eine XML-Datei als

folgt

<?xml version="1.0" encoding="UTF-8"?> 
 
<sections> 
 
\t <section name="Windows 7" id="7"> 
 
\t \t \t <section name="Registry" id="29"> 
 
\t \t \t \t <section name="hkcu" id="30"> 
 
\t \t \t \t \t <section name="software" id="31"> 
 
\t \t \t \t \t </section> 
 
\t \t \t \t </section> 
 
\t \t \t </section> 
 
\t </section> 
 
\t <section name="Server 2012" id="33"> 
 
\t </section> 
 
</sections>

ich einen Knoten dh löschen. <section> oder fügen Sie eine <section> hinzu. Worüber ich mich ärgere ist, dass es einen Weg gibt, einen Knoten und seine Kinder in einen anderen IE-Abschnitt zu verschieben. zum Beispiel verschieben Sie den Abschnitt mit ID = "30" und seine Kinder zu sagen Abschnitt mit der ID = "33".

Jede Hilfe wäre willkommen.

+0

Sie suchen nach XSLT hier. – Markus

+0

Oh Gott, nichts Einfaches ist da !! –

+0

Wer bereit ist, mir eine schnelle Idee zu geben, wie man das mit XLST macht –

Antwort

1

XSLT wurde entwickelt, um XML-Dokumente zu transformieren. Es verwendet Stylesheets, die die Umwandlung von einem XML-Eingabedokument in ein Ausgabedokument beschreiben.

z.

<?xml version="1.0"?> 
<sections> 
    <section name="Windows 7" id="7"> 
    <section name="Registry" id="29"> 
    </section> 
    </section> 
    <section name="Server 2012" id="33"> 
    <section name="hkcu" id="30"> 
     <section name="software" id="31"> 
     </section> 
    </section> 
    </section> 
</sections> 

XPath und XSLT nehmen ein wenig zu lernen, um zu beginnen, aber sobald man es beherrschen, haben Sie ein universelles Werkzeug zur Hand: die folgenden Transformation

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output version="1.0" encoding="UTF-8" method="xml" indent="yes" /> 
<xsl:strip-space elements="*"/> 

    <!-- identity transformation --> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:copy> 
    </xsl:template> 
    <!-- remove section with id 30 --> 
    <xsl:template match="section[@id='30']"/> 
    <!-- copy section with id 33 and add (as a child) section with id 30 --> 
    <xsl:template match="section[@id='33']"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" /> 
     <xsl:copy-of select="//section[@id='30']"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Ihre Eingabedatei in dieser Transformation um XML-Dokumente beliebig zu transformieren.

, auch XSLT in PHP laufen (unbedingt extension = php_xsl.dll oder extension = php_xsl.so in INI-Datei aktivieren) unten ausgeben wird eine Zeichenfolge XML-Wert, der in eine Datei gespeichert werden kann oder Echo auf Bildschirm:

// LOAD XML AND XSL FILES 
$xml = new DOMDocument('1.0', 'UTF-8'); 
$xml->load('Input.xml'); 

$xslfile = new DOMDocument('1.0', 'UTF-8'); 
$xslfile->load('XSLTSCript.xsl'); 

// TRANSFORM XML with XSLT 
$proc = new XSLTProcessor; 
$proc->importStyleSheet($xslfile); 
$newXML = $proc->transformToXML($xml); 

# ECHO OUTPUT STRING 
echo $newXML; 
+0

Gute Antwort. Ich habe bearbeitet, um den PHP-Code für OP hinzuzufügen, um XSLT zu implementieren. Außerdem sind die doppelten Forward-Schrägstriche mit Ausnahme des letzten redundant, und ich habe Ausgabe- und Strip-Tags in xslt hinzugefügt. Nach Bedarf bearbeiten! – Parfait

+0

Danke, ich werde das versuchen ... Sehr geschätzt, –

+0

Wow, das funktioniert ein Vergnügen. Vielen herzlichen Dank!!!!! –

Verwandte Themen