デフォルト名前空間付きのXMLを指定するXPath
検索対象XML
<A> <B xmlns:p="http://xxx.xxx.xxx"> <C> <D xmlns="http://yyy.yyy.yyy"> <E1>aaaaaa</E1> <E2>bbbbbb</E2> <E3> <F1>ccccc</F1> </E3> <E4> <F1>dddddd</F1> </E4> <E5>eeeee</E5> </D> </C> </B> </A>
これの[E5]を取りたい
ソラで適当に書くとこう
/A/B/C/D/E5
しかしデフォルト名前空間(プリフィックスなしの名前空間)が存在する為に検索できない。
- プリフィックス有り xmlns:p="http://xxx.xxx.xxx"
- プリフィックス無し xmlns="http://yyy.yyy.yyy"
苦心してこれ。
//*[namespace-uri()='http://yyy.yyy.yyy'][5]/text()
醜いので変形。
↓ まずは適当に
○ //*[contains(concat(" ",normalize-space(@E5)," "), " ")]
↓ お、いけた
○ //*[namespace-uri()='http://yyy.yyy.yyy']/*[contains(concat(" ",normalize-space(@F)," "), " ")]
↓ まぁなんでも当たりってやつ
○ //*[namespace-uri()='http://yyy.yyy.yyy']/*[contains(text(), "eeeee")]
↓ ふーん?
× //*[namespace-uri()='http://yyy.yyy.yyy']/*[contains(concat(" ",normalize-space(text())," "), " e ")]
↓ ありゃダメ
× //*[namespace-uri()='http://yyy.yyy.yyy']/*[start-with(text(),"e")]
↓ えー
○ //*[namespace-uri()='http://yyy.yyy.yyy']/*[contains(text(),"e")]
↓ お
○ //*[namespace-uri()='http://yyy.yyy.yyy']/*[contains(.,"e")]
↓ テキスト指定じゃちょっとね
○ //*[namespace-uri()='http://yyy.yyy.yyy']/*[contains(local-name(),"E5")]/text()
↓ javascript-xpathだとxmldocumentに対して使えない…
○ //*:E5[namespace-uri()='http://yyy.yyy.yyy']/text()
↓ ajaxsltが関数に対応してない…xpath解析すると戻ってこない…
○ //*:E5/
:の意味がわからん…