排序使用PHP
问题描述:
低于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
答
考虑一个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>
的XPath本身被设计用于导航XML文档,它并没有真正做到操纵或排序。 [这个答案](http://*.com/a/17625078/628267)提供了一些从XML中排序一些值的选项。 –
[使用SimpleXML/XPath对XML进行排序?](http://*.com/questions/3293257/sorting-xml-with-simplexml-xpath) – michi