- PR -

selectNodesメソッドで複数条件を指定したい

投稿者投稿内容
Cookie
ベテラン
会議室デビュー日: 2002/11/05
投稿数: 59
投稿日時: 2002-11-05 12:50
初めまして。早速で失礼ですが、質問させていただきます。

<名簿>
 <人事データ>
  <名前>田中一郎</名前>
  <出身>コンガ</出身>
  <生年月日>1950.12.1</生年月日>
 </人事データ>
  <名前>小林二郎</名前>
  <出身>ンジャメナ</出身>
  <生年月日>1956.11.5</生年月日>
 <人事データ>
 <人事データ>
   :
   :
</名簿>


上記のような構成のXMLから、出身と生年月日を指定して
該当する「人事データ」の件数を取得したい場合、
selectNodesメソッドはどのように記述すればよいのでしょうか。
本などで調べたところ、
 var list = document.documentElement.selectNodes("人事データ/出身[.='コンガ']");
 alert(list.length);
のような記述例は見つかったのですが、引数に渡すXPATH式で
「出身がコンガ&名前が田中一郎」というような内容を記述する方法がわかりません。

基礎的なことかもしれませんが、手持ちの資料も一通り見てしまったので
どなたかご存知の方にご意見頂きたいと思います。
よろしくお願いいたします。
Cookie
ベテラン
会議室デビュー日: 2002/11/05
投稿数: 59
投稿日時: 2002-11-05 14:54
すみません。タグの記述にミスがありました。
小林二郎の人事データに開始タグを記入し忘れましたが
構成は以下のつもりで書きました。

名簿
 ├人事データ
 |   ├名前
 |   ├出身
 |   └生年月日
 ├人事データ
 ├人事データ
 :
 :

[ メッセージ編集済み 編集者: Cookie 編集日時 2002-11-05 14:54 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2002-11-05 17:02
"人事データ/出身[.='コン ガ'][../名前='田中一郎']"
Cookie
ベテラン
会議室デビュー日: 2002/11/05
投稿数: 59
投稿日時: 2002-11-05 17:15
>MMX様

ありがとうございました!正しく実行出来ました。
ということは同様に↓のように書き換えられ、意味も同じということですよね。

  "人事データ[./出身='コンガ'][./名前='田中一郎']"

勉強になりました。初心者な質問ですみませんでした。
ありがとうございます。
Cookie
ベテラン
会議室デビュー日: 2002/11/05
投稿数: 59
投稿日時: 2002-11-06 10:03
たびたびすみません。
上記の条件指定について、一致ではなくあいまい検索をかけたかったのですが、

  "人事データ[./出身='コンガ'][contains(./名前,'田中一郎')]"  
  "人事データ[./出身='コンガ'][substring-before(./名前,'一郎')='田中']"

のような記述をしたところ、JavaScriptでランタイムエラーが発生してしまいました。

 行:(略)
 エラー:不明な方法です。

XSLでの記述時は正常に実行出来たのですが、JavaScriptのselectNodesメソッドの中では
使用できないのでしょうか?
Cookie
ベテラン
会議室デビュー日: 2002/11/05
投稿数: 59
投稿日時: 2002-11-06 13:55
自己レスです。
上記の件、開発しているのはIE6.0(MSXML4)なのですが、
MSXML4について
>selectNodesとかselectSingleNodeでデフォルトの名前空間に対して
>XPathで指定できないんだけど、これってバグ?
という書き込みを見つけました(某掲示板より)。

この方はMSXML3に変えたら普通に実行できたとのことです。
IE6.0のJavaScriptでは、私がやろうとしていることは不可能なんでしょうか?
タグ構成を変えるか、NodeListをプログラムでさらに絞り込むかするしか
ないのでしょうか。

まだまだXMLについては初心者のため、ステップ数やコーディング効率から
selectNodesメソッドがシンプルで良さそうかな?と目をつけただけですので、
本来の使い方から外れていたり、もっと本道なやり方をご存知の方は
ご指摘いただければ幸いです。

基本的な動作なので、出来ないはずはないと思うのですが…
私も本を6〜7冊山積みにして調べています。
進歩があったら報告に参ります。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2002-11-07 15:32
"人事データ[(出身='コンガ') and (contains(名前,'田中一郎'))]"
では?IE6とMSXML4との関係は?ヘルプの
Implementing MSXML 4.0 in Web Scripting
の形にはなっているでしょうか
Limitation of Side-by-Side Mode
には、データアイランドの非対応が書いてます,
Side-by-Side ではIE自身が内部で呼ぶのはMSXML3のままとか?。

[ メッセージ編集済み 編集者: MMX 編集日時 2002-11-08 00:11 ]
Cookie
ベテラン
会議室デビュー日: 2002/11/05
投稿数: 59
投稿日時: 2002-11-12 22:09
>MMX様
たびたびありがとうございます。
上記の自分の書き込み、カキコの解釈違いのようでした…(^-^;
すみません。

>"人事データ[(出身='コンガ') and (contains(名前,'田中一郎'))]"
同形式の記述をしてみましたが、やはり「不明な方法です。」エラーが出ました。
これを、複合条件ではなく人事データ[(contains(名前,'田中一郎'))]だけ記述しても
同じエラーが出てしまいます。
[(-->contains<--(名前,'田中一郎'))]
このような感じでエラー行が表示されます。

その他、substring-beforeやconcat等の関数も、同様のエラーが出て
使用できませんでした。

MMX様の仰るヘルプはまだ調べていませんでした。
調査不足ですね…もう少し調べてみます。

スキルアップ/キャリアアップ(JOB@IT)