4

だから私はこの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>

次の E4X クエリを使用すると、アイテム「aaa」とアイテム「bbb」のみが取得されます。

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

ただし、両方の id="1" && "2" であるため、項目 "ccc" が表示されない理由がわかります。

したがって、正しいクエリがここにあるべきかどうか、そして子孫が正しい手法である場合でも、実際にはわかりません。

これらの値の組み合わせは無限にあるため ("2" && "3", "1" && "2" && " 3") など

どんな考えでも最も役に立ちます..

ありがとう


したがって、パトリックは次の式でこれを解決しました。

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

ただし、これをさらに一歩進めると、@id 値を動的に作成する方法は、ユーザーの選択に応じて変化するクエリになるためです。

このようなもの(ただし、これは機能しません):

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

パトリック.. 誰か?

ありがとう

4

2 に答える 2

1

Or 検索の場合は、次のように簡単に実行できます。

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

カスタム フィルター関数を使用すると、Or よりも複雑な And 検索を実行できます。

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"] ) ) );
于 2012-05-28T17:39:15.253 に答える
0

これは面倒かもしれませんが、我慢してください:

Items.Item.(
    ( descendants("ProductRange").@id == "1" || descendants("ProductRange").@id == "2" ) ||
    ( descendants("ProductRange").@id == "1" && descendants("ProductRange").@id == "2" )
)
于 2012-05-28T16:32:52.337 に答える