Xml E4X选择子体可以是A或B或A&;的节点&;B

Xml E4X选择子体可以是A或B或A&;的节点&;B,xml,actionscript-3,e4x,Xml,Actionscript 3,E4x,所以我有这个XML结构: <Items> <Item name="aaa"> <ProductRanges> <ProductRange id="1" /> </ProductRanges> </Item> <Item name="bbb"> <ProductRanges> <ProductRange id="2" /> &l

所以我有这个XML结构:

<Items>
<Item name="aaa">
    <ProductRanges>
        <ProductRange id="1" />
    </ProductRanges>
</Item>
<Item name="bbb">
    <ProductRanges>
        <ProductRange id="2" />
    </ProductRanges>
</Item>
<Item name="ccc">
    <ProductRanges>
        <ProductRange id="1" />
        <ProductRange id="2" />
    </ProductRanges>
</Item>
</Items>
但是,我可以理解为什么我没有看到项目“ccc”,因为它同时是id=“1”和&“2”

因此,我不确定这里应该是什么样的正确查询,甚至不确定后代是否是正确的技术

我也不想以长时间的额外id=“1”&&id=“2”查询结束,因为我有这些值的无限组合(“2”&&“3”、“1”&“2”&“3”)等等

任何想法都会很有帮助

谢谢


帕特里克用这个表达式解决了这个问题:

xml.Item.(descendants('ProductRange').(@id=="1" || @id=="2").length()>0);
然而,更进一步,我们将如何动态创建@id值,因为这将是一个根据用户选择而变化的查询

类似这样的东西(但是这个,但是这个不起作用):

还有什么想法吗,帕特里克。。有人吗


谢谢

这可能有点乱,但请耐心听我说:

Items.Item.(
    ( descendants("ProductRange").@id == "1" || descendants("ProductRange").@id == "2" ) ||
    ( descendants("ProductRange").@id == "1" && descendants("ProductRange").@id == "2" )
)

对于Or搜索,您只需执行以下操作:

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

使用自定义筛选功能,您可以执行比Or更复杂的和搜索:

var xml:XML=<Items>
<Item name="aaa">
    <ProductRanges>
        <ProductRange id="1" />
    </ProductRanges>
</Item>
<Item name="bbb">
    <ProductRanges>
        <ProductRange id="2" />
    </ProductRanges>
</Item>
<Item name="ccc">
    <ProductRanges>
        <ProductRange id="1" />
        <ProductRange id="3" />
        <ProductRange id="2" />
    </ProductRanges>
</Item>
</Items>;

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<<i);
        }
        return mask==match;
    }
    node.(ProductRange.(fn(@id)));
    return mask==match;
}

trace( xml.Item.( andSearch( ProductRanges, ["1", "2"] ) ) );
var-xml:xml=
;
函数和搜索(节点:XMLList,搜索:数组){
变量掩码:int=0;
变量匹配:int=(1=0){

mask=mask |(1我不认为这里的布尔逻辑正确吗?你能仔细检查一下吗。如果(ProductRange.id==1或ProductRange.id==2)作为谓词1,这是真的,如果其中一个是真的,那么它是“或”同样,对于部分包含ProductRange.id==1的内容,如果该部分为true,则第一个谓词已经为true,因此“orring”没有任何影响?感谢您的尝试…但这仍然只返回“aaa”和“bbb”。将尝试Patrick的建议。这只是返回“ccc”…这似乎非常有用,但我是否理解这只会返回“和”组合。我仍然需要单独查询“或”?@ukmikeb是的,这是用于比OR更复杂的AND搜索,我在上面添加了OR查询。嘿,Patrick,你知道吗,你的OR qury实际上正是我需要的。xml.Item。(子体('ProductRange')。(@id==“1”| |@id==“2”).length()>0);我的OR查询未返回“ccc”但是你的是…非常感谢!我上面的编辑有什么想法…需要从数组或字符串中动态生成值吗?!你应该打开另一个问题,因为这个问题已经得到了回答,可以生成一个包含你的值的数组,然后搜索它:
xml.Item.(descendants('ProductRange').(@id=="1" || @id=="2").length()>0);
var xml:XML=<Items>
<Item name="aaa">
    <ProductRanges>
        <ProductRange id="1" />
    </ProductRanges>
</Item>
<Item name="bbb">
    <ProductRanges>
        <ProductRange id="2" />
    </ProductRanges>
</Item>
<Item name="ccc">
    <ProductRanges>
        <ProductRange id="1" />
        <ProductRange id="3" />
        <ProductRange id="2" />
    </ProductRanges>
</Item>
</Items>;

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<<i);
        }
        return mask==match;
    }
    node.(ProductRange.(fn(@id)));
    return mask==match;
}

trace( xml.Item.( andSearch( ProductRanges, ["1", "2"] ) ) );