更新信息:
前面,我讨论了如何根据每个元素的几个属性对XML进行排序。那里的答案是有效的(这就是我创建一个新问题的原因),但是我发现我的PHP版本没有安装XSLT库,并且我的IT不会安装它。
我找到了一种使XML成为关联数组的方法,但这似乎真的很繁琐。
此外,我有几个级别的排序(大约6);由于答案太多,我无法实现下面的另一个答案。
所以,我的最后一个问题是:有没有可能在不使用XSLT的情况下对XML进行排序?每次我谷歌一下,所有的网站都显示如何使用XSLT…再次感谢大家!
OLD INFO::::::我对DOM和XSL进行了大量的研究,但似乎找不到对多个元素进行排序的方法。我已经成功地使用DOM生成了XML,但是现在我想基于多个值进行排序。
我希望在<item>
下有另一个孩子,也许标题为<Priority>
,或者我可以把它放在<item priority=__>
为简单起见,以下是我试图做的简化版本:
XML之前:
<root>
<item>
<attr1>2</attr1>
<attr2>50</attr2>
</item>
<item>
<attr1>1</attr1>
<attr2>100</attr2>
</item>
<item>
<attr1>2</attr1>
<attr2>10</attr2>
</item>
<item>
<attr1>2</attr1>
<attr2>50</attr2>
</item>
<item>
<attr1>1</attr1>
<attr2>75</attr2>
</item>
<item>
<attr1>2</attr1>
<attr2>1</attr2>
</item>
</root>
我想找到一种方法首先对attr1进行排序,如果它们相同,则对attr2进行排序。如前所述,我不关心如何排序,也不关心是否在元素(如<item priority = ___>
)、每个<item>
的新元素或全新的xml文件中使用属性。我真不知道下一步该怎么办;到目前为止,我一直在使用PHP,但可以切换到其他东西。提前感谢!
如果您愿意的话,可以通过sort元素和concat()在xslt中完成。
<xsl:template match="/root">
<xsl:apply-templates>
<xsl:sort select="concat(attr1,attr2)"/>
</xsl:apply-templates>
</xsl:template>
编辑No XSLT子句
另一种方法是将所有元素加载到具有attr1和attr2属性等的项对象集合中,然后根据规则对集合进行排序,然后可以将其以新排序的顺序写回xml。
function getval($i) {
global $feeditem;
return $feeditem->getElementsByTagName($i)->item(0)->nodeValue;
}
$info = "";
$xmldoc = new DOMDocument();
$xmldoc->load('path_to_xml_file_here.xml');
foreach ($xmldoc->getElementsByTagName('item') as $feeditem){
if(getval('attr1') == getval('attr2')) {
#blablabla
} else {
#blablabla
}
}