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

时间:2011-07-20 18:16:57

标签: php xml sorting

更新信息:

以前,我问过如何根据每个元素的几个属性对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,但可以切换到别的东西。提前谢谢!

2 个答案:

答案 0 :(得分:1)

如果您更喜欢这种路线,可以通过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中它是新排序的。

答案 1 :(得分:0)

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
        }
}