按日期排序XML数据输出

时间:2017-08-29 15:09:13

标签: php xml

我确实有以下XML数据:

 <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>

使用以下循环输出数据:

<?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 } ?>

结果是:

<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>

但是知道我想按日期订购时间,以获得此输出:

<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>

有没有办法修改循环,得到这个结果?我非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

考虑XSLT,这是用于转换XML文件的专用语言,因为您实际需要的是一个名为Muenchian Grouping的XSLT 1.0方法,您可以使用文档键对节点进行分组并检索或操作所有相应的值。

PHP可以使用其php-xsl扩展名运行XSLT 1.0脚本(确保在.ini文件中启用)。使用此方法,不需要foreach循环或if逻辑。

XSLT 脚本(另存为.xsl文件,可以像任何XML一样处理的特殊.xml文件)

<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 (引用上面的.xsl文件)

// 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);

输出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>