假设我们有这个e4x片段:
zoo = <zoo />;
zoo.animal += <animal animal-type='bear' name='Woofer' />;
zoo.animal += <animal animal-type='panda' name='Ling-Ling' />;
zoo.animal += <animal animal-type='seal' name='Arthur' />;
我可以过滤以W或L开头的名字:
js>zoo.animal.(@name.match(/^[WL]/))
<animal animal-type="bear" name="Woofer"/>
<animal animal-type="panda" name="Ling-Ling"/>
但我如何过滤动物类型?属性“animal-type”中有一个破折号,所以我不能使用@ animal-type语法,而更通用的语法['@ animal-type']似乎不能作为谓词选择器。< / p>
有没有办法在e4x过滤谓词中选择当前节点?
更新:在这种情况下我得到了一个解决方法,我知道所有元素都有“name”属性:
js>zoo.animal.(@name.parent()['@animal-type'].match(/^[bp]/))
<animal animal-type="bear" name="Woofer"/>
<animal animal-type="panda" name="Ling-Ling"/>
但这不会起作用。
更新2:唉!如此接近:
f1=function(attr) {
var b = attr.match(/bear/) != null;
writeln(attr+":"+b);
return b;
}
f2=function(attr) {
var b = attr.match(/bear/) != null;
writeln(attr+":"+b);
return true;
}
js>zoo.*.(f1(@['animal-type']))
bear:true
panda:false
seal:false
js>zoo.*.(f2(@['animal-type']))
bear:true
panda:false
seal:false
<animal animal-type="bear" name="Woofer"/>
<animal animal-type="panda" name="Ling-Ling"/>
<animal animal-type="seal" name="Arthur"/>
WTF?我可以访问animal-type
属性,如果我返回无条件true,我可以使用函数作为过滤谓词,但如果我返回比较结果,它似乎忽略该结果。
答案 0 :(得分:2)
Argh - 当我跑步时,Javascript解释器处于一种奇怪的状态。如果我从头开始,这是有效的:
zoo = <zoo />;
zoo.animal += <animal animal-type='bear' name='Woofer' />;
zoo.animal += <animal animal-type='panda' name='Ling-Ling' />;
zoo.animal += <animal animal-type='seal' name='Arthur' />;
js>zoo.animal.(@['animal-type'].match(/^[bp]/))
<animal animal-type="bear" name="Woofer"/>
<animal animal-type="panda" name="Ling-Ling"/>
js>zoo.animal.(@['animal-type'].match(/^[ps]/))
<animal animal-type="panda" name="Ling-Ling"/>
<animal animal-type="seal" name="Arthur"/>
如果它返回一个结果,我也必须小心:
js>zoo.animal.(@['animal-type'].match(/^p/))
js>zoo.animal.(@['animal-type'].match(/^p/)).toXMLString()
<animal animal-type="panda" name="Ling-Ling"/>
如果XML节点没有任何后代元素或文本内容,则它们看起来是“不可见的”+您需要调用toXMLString()将它们转换为字符串。