首先,如果你的環境是瀏覽器,甚至是Firefox擴展,我建議不要使用E4X繼續,因爲他們已經過時了。
這就是說,這裏是我可以找到在測試什麼工作(很少),什麼不工作,試圖做你正在做的事情。
儘管它很有用,並且它看起來適合過濾器/訪問器語法,但刪除父級(或您的案例中的父級)似乎並不奏效(至少在我嘗試時與Mozilla的E4X引擎 - 順便說一句,我記得,下面使用的function::
可能只支持Spidermonkey)。
var a = <a>
<b>
<c/>
</b>
</a>;
delete a.b.c.parent(); // Removing parent() will delete <c/>
alert(a); // <b/> is not deleted
因此自然地,在把你的例子:
var xml = <><parentnode>
<childnode>
<babynode id="1">
<parameter>goes here</parameter>
</babynode>
</childnode>
</parentnode>
<parentnode>
<childnode>
<babynode id="2">
<parameter>goes here</parameter>
</babynode>
</childnode>
</parentnode></>;
...而這(使用..
後代選擇):
alert(xml..*.(function::attribute('id') == "2")[0].parent().parent()); // I'm also not sure why the formatting of the attribute cannot be obtained by `xml..*.(@id == "2")` without giving an error since id is not a reserved word, but anyways...
...沒有得到<parentnode>
你想要刪除它,就像在下面不起作用:
delete xml..*.(function::attribute('id') == "2")[0].parent().parent();
......即使這樣的:
delete xml..*.(function::attribute('id') == "2")[0];
...至少會刪除你要刪除的<babynode>
部分。
從理論上講,我認爲以下(即沒有0馬克其選擇,而不是僅僅過濾祖先的後代的過濾元件)應該工作(或者至少如果沒有這將是很好!):
delete xml..(function::attribute('id') == "2")[0];
......但它沒有。
即使在這種方式訪問一個元件(未抓住一個descedant的)似乎不工作:
alert(xml..(function::attribute('id') == "2")[0]);
即使我們避免使用的XMLList(<></>
被上面如果所使用的短手語法你不熟悉它),敷在XML命名的一些元素,比如<container>
,刪除或訪問仍然不能正常工作:
delete xml.container..(function::attribute('id') == "2")[0];
你可以在http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-357.pdf看看,看看你的讀數應允許這一點,但無論如何它不起作用,至少我已經嘗試過了。
所以,據我所見,唯一的解決方案是遍歷元素並跟蹤手動位置而不是使用過濾器。
順便說一句,你可能想要修正你的E4X語法(就像我下面做的那樣),只要你的標記結束標記是自閉標記 - 以防它可能會鼓勵某人更快地測試你的代碼(假設有一個更好的答案被發現)。 – 2012-04-20 02:40:34