私はIE9でいくつかのxpathクエリを作成しようとしていますが、いくつかのソートは成功していますが、確かに試しているだけで、何が機能し、何が機能しないかを明確に理解できません。
私は2つのことをしたい:
- 読み込まれた xml からのカスタム名前空間の要素のクエリ
- カスタム名前空間属性を持つインライン svg のクエリ要素
ポイント1は、次のコードを使用して機能します:
doc.setProperty( "SelectionLanguage", "XPath" );
doc.setProperty( "SelectionNamespaces", xpathNsString );
svg = cloneSVGNode( doc.selectSingleNode( '//graphic/svg:svg' ) );
ここdoc
で、ロードされた xml への参照です。xpathNsString は次のとおりです。
"xmlns=\"http://www.w3.org/1999/xhtml\" " +
"xmlns:svg=\"http://www.w3.org/2000/svg\" "+
"xmlns:dc=\"http://purl.org/dc/elements/1.1/\" "+
"xmlns:cc=\"http://creativecommons.org/ns#\" "+
"xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" "+
"xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\" "+
"xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" "+
"xmlns:mine=\"http://www.mine.org\" "+
"xmlns:html=\"http://www.w3.org/1999/xhtml\"";
そしてcloneSVGNode
、結果全体を複製してDOMに追加できるようにする関数-これは機能します。
コードの後半で、次のようなクエリを使用して、(現在 DOM にある) SVG のいくつかの要素をクエリしたいと思います。
//svg:g[@mine:my-name="my-value"]
しかし、これは機能しません。IE は DOM 要素に対する xpath クエリをサポートしていないことを読みましたが、このスタックオーバーフローの質問でどのように説明されているかは、これを行う方法があるようです。そこで、質問の回答 ( http://sourceforge.net/projects/html-xpath/ ) に記載されているフレームワークのバージョンを取得し、いくつかのテストを行いました。その結果、いくつかの html 要素を取得できましたが、名前空間と svg で機能することを拒否し、「プレーン xml」で機能しました。それにもかかわらず、lib のソースコードをちらりと見ると、次の戦略を確認できました (これについては完全にはわかりませんが、全体としてはこのようなものだと思います)。
- ノードを新しいxmlドキュメントに複製します
- クエリ xpath
- 実ノードの相手ノードを返す
それで、IE9にDOMの名前空間付きxpathクエリを作成させることは可能ですか?それはxmlで可能であり、domノードはxmlに変換されますか?
こんにちはフィリップ
編集:
私は試みを続け、最終的に成功することができました.どういうわけか、コードは混乱していますが、結果をもたらします. だから私は今、「答えはイエスです、可能です」と言うことができます。. まだいくつかのテストが必要ですが、全体的なアプローチは次のとおりです。
- 新しい空の xml ドキュメントを作成する
- 適切な名前空間プロパティを設定します (上記) !IMPORTANT
- コンテキスト ドキュメントのツリーを再帰的にたどり、新しい xml ドキュメントから新しい要素を作成してすべての要素を複製します。
- それにより: コンテキスト ドキュメントの要素から一意の ID を生成し、それを複製された要素とコンテキスト ドキュメントの要素 (存在しない場合) に割り当てます。「元の」要素と「複製された」要素を含むオブジェクトを、ID をキーとするハッシュマップに挿入します。
- xpath を使用して新しいドキュメントをクエリする
- 結果を取得し、ID を取得して、マップから元の要素を取得します。
- 元々何も持っていなかった要素からすべてのIDを削除することにしました。
終わり...
興味がある場合は、コードを投稿できます...