2017-08-29 2 views
1

habe ich folgende XML-Daten:Bestellen XML Datenausgabe von Datum

<schedule> 
    <event> 
    <date>2017-08-25</date> 
    <time>16:00</time> 
    </event> 
    <event> 
    <date>2017-08-25</date> 
    <time>20:00</time> 
    </event> 
    <event> 
    <date>2017-08-26</date> 
    <time>16:00</time> 
    </event> 
    <event> 
    <date>2017-08-26</date> 
    <time>20:00</time> 
    </event> 
    </event> 
    <event> 
    <date>2017-08-27</date> 
    <time>20:00</time> 
    </event> 
</schedule> 

die Daten, die ich folgende Schleife Zur Ausgabe kann unter Verwendung von:

<?php $xml = simplexml_load_file('events.xml'); ?> 
<?php foreach ($xml->event as $event) { ?> 
<dl> 
    <dt> 
     <?php echo $event->date; ?> 
    </dt> 
    <dd> 
     <?php echo $event->time; ?> 
    </dd> 
</dl> 
<?php } ?> 

Das Ergebnis ist:

<dl> 
    <dt>2017-08-25</dt> 
    <dd>16:00</dd> 
</dl> 
<dl> 
    <dt>2017-08-25</dt> 
    <dd>20:00</dd> 
</dl> 
<dl> 
    <dt>2017-08-26</dt> 
    <dd>16:00</dd> 
</dl> 

usw.

Aber ich möchte bestellen die Zeit, nach Datum, diese Ausgabe zu erhalten:

<dl> 
    <dt>2017-08-25</dt> 
    <dd>16:00</dd> 
    <dd>20:00</dd> 
</dl> 

<dl> 
    <dt>2017-08-26</dt> 
    <dd>16:00</dd> 
    <dd>20:00</dd> 
</dl> 

usw.

Gibt es eine Möglichkeit, die Schleife zu ändern, um dieses Ergebnis zu bekommen? Ich wäre sehr dankbar für jede Hilfe!

+1

sehen hier https://stackoverflow.com/questions/15204305/re-order-xml-results-based-on-xml-data – clearshot66

Antwort

1

Betrachten Sie XSLT, die spezielle Sprache zum Transformieren von XML-Dateien, denn was Sie tatsächlich brauchen, ist eine XSLT 1.0-Methode namens Muenchian Grouping wo Sie nach Knoten mit einem Dokumentschlüssel gruppieren und alle entsprechenden Werte abrufen oder bearbeiten.

PHP kann XSLT 1.0-Skripts mit seiner Erweiterung php-xsl ausführen (stellen Sie sicher, dass es in der INI-Datei aktiviert ist). Bei diesem Ansatz wird keine Logik benötigt.

XSLT Script (speichern als XSL-Datei, eine spezielle XML-Datei, die wie jede XML behandelt werden kann)

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

<xsl:key name="eventid" match="event" use="date" /> 

    <xsl:template match="/schedule"> 
    <root> 
     <xsl:apply-templates select="event"/> 
    </root> 
    </xsl:template> 

    <xsl:template match="event"> 
    <dl>  
     <xsl:for-each select=".[generate-id() = generate-id(key('eventid', date)[1])]"> 
      <dt><xsl:value-of select="date"/></dt> 
      <xsl:for-each select="key('eventid', date)"> 
       <dd><xsl:value-of select="time"/></dd> 
      </xsl:for-each> 
     </xsl:for-each> 
    </dl>  
    </xsl:template> 

</xsl:transform> 

PHP(Referenzierung über XSL-Datei)

// LOAD XML AND XSL 
$xml = new DOMDocument(); 
$xml->load('Input.xml');  // OR $xml->loadXML($xmlstring); 

$xsl = new DOMDocument; 
$xsl->load('XSLTScript.xsl'); // OR $xsl->loadXML($xslstring); 

// INITIALIZE TRANSFORMER 
$proc = new XSLTProcessor; 
$proc->importStyleSheet($xsl); 

// RUN TRANSFORMATION 
$newXML = $proc->transformToXML($xml); 

// ECHO STRING OUTPUT 
echo $newXML; 

// SAVE OUTPUT TO FILE 
file_put_contents('Output.xml', $newXML); 

Output (online transform)

<root> 
    <dl> 
     <dt>2017-08-25</dt> 
     <dd>16:00</dd> 
     <dd>20:00</dd> 
    </dl> 
    <dl/> 
    <dl> 
     <dt>2017-08-26</dt> 
     <dd>16:00</dd> 
     <dd>20:00</dd> 
    </dl> 
    <dl/> 
    <dl> 
     <dt>2017-08-27</dt> 
     <dd>20:00</dd> 
    </dl> 
</root> 
+0

Vielen Dank für Ihre detaillierte Schritte zu realisieren! Ich mag die Art, XSLT zu verwenden. Leider habe ich vergessen zu erwähnen, dass ich keinen Einfluss auf die Änderung der XML-Datei habe. Die Datei basiert als API-Schlüssel auf externen Servern. – Filip

+0

Sie ändern nicht die ursprüngliche XML-Datei, sondern transformieren das Original und speichern es in einer neuen Datei. Und wenn Ihre Ausgabe nur zum Bildschirm ist, sollte 'echo $ newXML; – Parfait

Verwandte Themen