まず、環境がブラウザーまたは 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>
たい部分を削除します。
理論的には、次の方法 (つまり、*
祖先をフィルタリングするだけでなく、子孫のフィルタリングされた要素を選択するマークなし) が機能するはずです (または、少なくとも機能していればよいでしょう!)。
delete xml..(function::attribute('id') == "2")[0];
...しかし、そうではありません。
この方法 (子孫を取得しない) で要素にアクセスしても機能しないようです。
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を見て、これが許可されているかどうかを確認できますが、いずれにせよ機能しません。少なくとも私が試したように。
したがって、私が見る限り、唯一の解決策は、フィルターを使用するのではなく、要素を繰り返し処理し、現在の場所を手動で追跡することです。