在没有XSLT的情况下根据多个属性对XML进行排序


Sorting an XML on multiple attributes WITHOUT XSLT

更新信息:

前面,我讨论了如何根据每个元素的几个属性对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
        }
}