E4X selectați noduri unde descendenții pot fi A OR B sau A && B

Deci, am această structură XML:



    
        
    


    
        
    


    
        
        
    


Folosind următoarea interogare E4X primesc doar elementul "aaa" și elementul "bbb".

trace(   Items.Item.(descendants("ProductRange")[email protected] == "1" || descendants("ProductRange")[email protected] == "2")   );

However, I can kind of see why I'm not seeing item "ccc" because it is BOTH id="1" && "2"

Deci, nu prea sigur ce interogare corectă ar trebui să fie aici, și chiar dacă descendenții sunt tehnica corectă.

I don't want to end up doing long additional id="1" && id="2" queries either because I have unlimited combinations of these values ("2" && "3", "1" && "2" && "3") etc..

Orice gânduri ar fi de mare ajutor.

Mulțumiri


Deci, Patrick a rezolvat această problemă cu această expresie:

xml.Item.(descendants('ProductRange').(@id=="1" || @id=="2").length()>0);

Cu toate acestea, luând acest pas mai departe, cum ar crea dinamic valorile @id, deoarece aceasta va fi o interogare în schimbare în funcție de selecțiile utilizatorilor.

Ceva de genul asta (dar asta, dar asta nu merge):

var attributeValues:String = "@id==\"1\" || @id==\"2\" || @id==\"3\" || @id==\"4\"";
xml.Item.(descendants('ProductRange').(attributeValues).length()>0);

Mai multe gânduri Patrick .. oricine?

Mulțumiri

0
Ar trebui să deschideți o altă întrebare, deoarece aceasta a fost răspunsă, poate fi făcută o matrice care să țină valorile dvs. și apoi să o căutați: pastebin. com/vxyVK86V
adăugat autor Patrick, sursa

2 răspunsuri

Pentru Căutarea pe care o puteți face pur și simplu:

xml.Item.(descendants('ProductRange').(@id=="1" || @id=="2").length()>0);

Folosind o funcție personalizată de filtrare, puteți să vă faceți căutarea, care este mai complicată decât o Or:

var xml:XML=

    
        
    


    
        
    


    
        
        
        
    

;

function andSearch(node:XMLList, searchFor:Array) {
    var mask:int = 0;
    var match:int = (1 << searchFor.length ) - 1;
    var fn:Function = function(id:String) {
        var i:int = searchFor.indexOf(id);
        if (i >= 0) {
            mask = mask | (1<
0
adăugat
Acest lucru este doar returnarea "ccc" ... Acest lucru pare foarte util, dar am înțeles că acest lucru se va întoarce NUMAI combinații "ȘI". Voi trebui să interoghez separat "OR"?
adăugat autor ukmikeb, sursa
Brilliant .. Mulțumesc lui Patrick!
adăugat autor ukmikeb, sursa
Hei, Patrick știi ce, orificiul tău sau de fapt era exact ceea ce aveam nevoie. xml.Item (descendenți ('ProductRange'). (@ id == "1" || @id == "2") lungime ()> 0); Interogarea mea OR nu se întoarce "ccc", dar a ta este .... multumesc mult!
adăugat autor ukmikeb, sursa
orice gânduri de pe editarea mea de mai sus ... trebuie să facă dinamică valorile, dintr-o matrice sau șir ?!
adăugat autor ukmikeb, sursa
@ukmikeb Da, care a fost pentru căutarea și că este mai complicat decât Or, am adăugat interogarea Or de mai sus.
adăugat autor Patrick, sursa
@ukmikeb Ești binevenit.
adăugat autor Patrick, sursa

Acest lucru poate fi dezordonat, dar purtați cu mine:

Items.Item.(
    ( descendants("ProductRange")[email protected] == "1" || descendants("ProductRange")[email protected] == "2" ) ||
    ( descendants("ProductRange")[email protected] == "1" && descendants("ProductRange")[email protected] == "2" )
)
0
adăugat
Vă mulțumim pentru încercare ... dar acest lucru întoarce doar "aaa" și "bbb". Să încercați sugestia lui Patrick.
adăugat autor ukmikeb, sursa
Nu cred că logica booleană este corectă? puteți verifica dublu. Cum citesc acest lucru este daca (ProductRange.id == 1 sau ProductRange.id == 2) ca predicat 1, acesta este adevarat daca oricare dintre ele este adevarat, atunci este "ored" din nou cu ceva ce in parte include ProductRange .id == 1, dacă acea parte este adevărată, primul predicat a fost deja adevărat, prin urmare "orring" nu are nici un efect?
adăugat autor shaunhusain, sursa