Фильтр e4x для более чем одного ребенка?

Мой XML выглядит так:

<?xml version="1.0" encoding="utf-8" ?>
<projects>
    <project 
        id="1"
        thumb="media/images/thumb.jpg"
        >
        <categories>
            <id>1</id>
            <id>2</id>
        </categories>
        <director>Director name</director>
        <name><![CDATA[IPhone commercial]]></name>
        <url><![CDATA[http://www.iphone.com]]></url>
        <description><![CDATA[Description about the project]]></description>
        <thumb><![CDATA[/upload/images/thumb.jpg]]></thumb>
    </project>
</projects>

Но я не могу понять, как фильтровать проекты по идентификатору категории? Кто-нибудь знает, как это сделать? :)

Что-то типа:

projects.project.(categories.(id == 3))

Просто возвращает все элементы :(


person Chris    schedule 19.05.2010    source источник


Ответы (2)


Вот лучший способ без использования каких-либо пользовательских функций:

projects.project.(categories.id.contains(1))

contains принимает одно значение для проверки в объекте XML или XMLList.


Вы можете использовать дополнительную функцию для обработки:

// check if any of the <id> nodes matches any of the given values
function containing(nodes, values) {
    for each(var id in nodes) {
        if(values.indexOf(parseInt(id)) !== -1) return true;
    }
    return false;
}

projects.project.(containing(categories.id, [1])); // matches the first project
projects.project.(containing(categories.id, [46])); // matches nothing
person Anurag    schedule 19.05.2010
comment
Отлично, спасибо :) отлично работает, но надеялся, что у e4x есть встроенная поддержка такого рода запросов. - person Chris; 20.05.2010
comment
Пожалуйста. Есть лучший способ без использования каких-либо функций. Обновил ответ. - person Anurag; 21.05.2010

это должно быть projects.project..(id==3), двойная точка пропускает любые узлы, хотя это проблема, если у вас больше идентификаторов.

Теперь, если бы я делал это в actionScript, откуда берутся все мои знания e4x, я бы сделал это projects.project.containing.(id==3).parent() Я не уверен, поддерживает ли JS этот родительский метод или, может быть, у него есть свой собственный.

person invertedSpear    schedule 19.05.2010