2016-02-04 89 views
0

低于XPath是我的XML,我需要在PHP中使用XPath按年龄排序排序使用PHP

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

的XPath本身被设计用于导航XML文档,它并没有真正做到操纵或排序。 [这个答案](http://stackoverflow.com/a/17625078/628267)提供了一些从XML中排序一些值的选项。 –

+0

[使用SimpleXML/XPath对XML进行排序?](http://stackoverflow.com/questions/3293257/sorting-xml-with-simplexml-xpath) – michi

回答

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文件。下面是一个嵌入式解决方案:

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

输出

<?xml version="1.0" encoding="UTF-8"?> 
<Guest> 
    <Ages> 
    <Age>2</Age> 
    <Age>5</Age> 
    <Age>6</Age> 
    <Age>12</Age> 
    <Age>22</Age> 
    </Ages> 
</Guest>