【问题标题】:Sorting an XML on multiple attributes WITHOUT XSLT在没有 XSLT 的情况下对多个属性的 XML 进行排序
【发布时间】:2011-07-20 18:16:57
【问题描述】:

更新信息:

之前,我问过如何根据每个元素的多个属性对 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 上排序。正如我之前所说,我不关心如何排序,也不关心我们是否在 &lt;item priority = ___&gt; 之类的元素中使用该属性、每个 &lt;item&gt; 的新元素或全新的 xml 文件。我很迷茫,不知道下一步该做什么;到目前为止,我一直在使用 PHP,但可以切换到其他东西。提前致谢!

【问题讨论】:

    标签: php xml sorting


    【解决方案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 in这是新排序的顺序。

    【讨论】:

    • 谢谢 Matthew,作为一个快速跟进,你能告诉我是否可以将这种类型的东西放在我的 PHP 文件中,还是这是一个新文件?
    • 这里快速介绍如何将 xslt 与 php5 结合使用。 tonymarston.net/php-mysql/xsl.html
    • 太棒了!如果我有更多的声誉,我会升级它,但现在,我只能做到这一点:-P。谢谢!!
    • 感谢您的信息,但看起来我根本无法使用 XSL...还有其他提示吗?
    【解决方案2】:
    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
            }
    }
    

    【讨论】:

    • 不能使用这个,因为我要进行 6 次以上的比较
    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 2014-07-28
    • 2020-01-25
    • 1970-01-01
    • 2011-04-12
    • 2018-06-28
    • 2023-03-20
    • 2019-02-17
    相关资源
    最近更新 更多