使用php按xpath排序

时间:2016-02-04 22:54:43

标签: php xml xpath

下面是我的Xml,我需要使用php中的xpath按年龄排序

<Guest>
<Ages>
<Age>22</Age>
<Age>6</Age>
<Age>5</Age>
<Age>2</Age>
<Age>12</Age>
</Ages>
</Guest>

我尝试下面的代码,但没有工作

foreach ($xd->xpath('Guest/Ages[descendant::Age]') as $xd_age)
        {
            echo $xd_age->Age.',';
        }

我需要如下

Ages : 2,5,6,12,22

1 个答案:

答案 0 :(得分:1)

考虑一个XSLT解决方案。作为信息,XSLT是一种特殊用途的声明性语言,专门用于处理XML文件(而不仅仅是HTML的样式表)。实际上,所有通用语言,Java,C#,Perl,Python,VB都带有XSLT 1.0处理器,包括PHP -even命令行程序,如PowerShell和Bash。还存在各种专用处理器,例如开源Saxon(可以运行XSLT 2.0脚本)和Apache Xalan

PHP可以嵌入或调用外部XSLT脚本(.xsl或.xslt),顺便提一下,它是格式良好的XML文件。以下是嵌入式解决方案:

Message

<强>输出

// Load the XML source
$doc = new DOMDocument();
$doc->load('Input.xml');

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

              <!-- IDENTITY TRANSFORM -->
              <xsl:template match="@*|node()">
                <xsl:copy>
                  <xsl:apply-templates select="@*|node()"/>
                </xsl:copy>
              </xsl:template>  

              <!-- SORT AGE CHILDREN IN EACH AGES NODE -->
              <xsl:template match="Ages">
                <xsl:copy>
                  <xsl:apply-templates select="Age">
                    <xsl:sort select="." order="ascending" data-type="number"/>
                  </xsl:apply-templates>
                </xsl:copy>
              </xsl:template>

            </xsl:transform>';

$xsl = new DOMDocument;
$xsl->loadXML($xslstr);

// Configure the processor
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); 

// Transform XML source
$newXml = $proc->transformToXML($doc);    
echo $newXml;

// Save output to file
$xmlfile = 'Output.xml';
file_put_contents($xmlfile, $newXml);