e4x:使用破折号过滤子元素/属性?

时间:2011-04-01 18:59:36

标签: javascript predicate e4x

假设我们有这个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,我可以使用函数作为过滤谓词,但如果我返回比较结果,它似乎忽略该结果。

1 个答案:

答案 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()将它们转换为字符串。