Сортировка XML по нескольким атрибутам БЕЗ XSLT - PullRequest
1 голос
/ 20 июля 2011

Обновленная информация:

Ранее я спрашивал, как сортировать XML на основе нескольких атрибутов каждого элемента. Там был правильный ответ (именно поэтому я создаю новый вопрос), но я обнаружил, что у меня есть ограничения, когда в моей версии PHP не установлена ​​библиотека XSLT, и мои ИТ не будут ее устанавливать.

Я нашел способ сделать мой XML ассоциативным массивом, но это очень утомительно, чтобы разобраться.

Также у меня есть несколько уровней сортировки (около 6); поскольку их так много, я не могу реализовать другой ответ ниже.

Итак, мой последний вопрос: возможно ли отсортировать XML без использования XSLT? Каждый раз, когда я запускаю Google, все сайты показывают, как использовать XSLT ...

Еще раз спасибо всем!


СТАРАЯ ИНФОРМАЦИЯ :::::: Я провел целую кучу исследований между DOM и XSL и, похоже, не могу найти способ сортировки по нескольким элементам. Я успешно сгенерировал свой XML с использованием DOM, но теперь я хочу отсортировать по нескольким значениям.

Я бы предпочел иметь еще одного ребенка под <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 ]

1 голос
/ 20 июля 2011

Это можно сделать с помощью xslt через элемент sort и concat (), если вы предпочитаете этот маршрут.

    <xsl:template match="/root">
        <xsl:apply-templates>
            <xsl:sort select="concat(attr1,attr2)"/>
        </xsl:apply-templates>
    </xsl:template>

РЕДАКТИРОВАТЬ для предложения No XSLT

Еще один способ сделать это - загрузить все элементы в коллекцию объектов item со свойствами attr1 и attr2 и т. Д., А затем отсортировать коллекцию по вашим правилам, после чего вы можете записать ее обратно в xml в это недавно отсортированный заказ.

0 голосов
/ 20 июля 2011
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
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...