- PR -

Xpathによる属性値の取得

1
投稿者投稿内容
アバニ
会議室デビュー日: 2005/10/27
投稿数: 8
投稿日時: 2005-10-27 06:56
はじめまして。
Xpathの使い方を覚え始めたばかりの初心者です。なんとか属性値を検索し特定のノードを取り出せるようになりました。が、どうしても解決できない問題にぶつかり、アドバイスをお願いしたく書き込んでいます。次のようにcolorという属性の値が一つの時は、「//flag[@color="red"]」みたいに書くと検索がうまくいきました。

<flag color="red">China</flag>


ところが、

<flag color="red white">Japan</flag>

というように、colorという属性に値がいくつかあり、それらが空白で区切られている場合、一つの値だけを書いて検索すると全く引っかかりません。いろいろと正規表現もどきも試してみたのですが、うまくいきませんでした。属性の値を全て書かなくてはならないのでしょうか。なにとぞアドバイスをお願いいたします。

MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-10-27 11:05
検索語
xpath 関数 contains(
では
XPathとXSLTの関数 【文字列関数】 contains
http://www.cityfujisawa.ne.jp/~yanai/xml/functions/step14.html
アバニ
会議室デビュー日: 2005/10/27
投稿数: 8
投稿日時: 2005-10-27 19:10
MMXさま、

早速のお答えありがとうございました。contains関数を使って試してみます。
アバニ
会議室デビュー日: 2005/10/27
投稿数: 8
投稿日時: 2005-10-28 07:37
MMXさま

うまくいきました。リンク情報ありがとうございました。今、特定の属性値を満たす二つ以上の子ノードを含んだ親ノードの取得を試みてますが、まだうまくいってません。子ノードが一つの時はうまくいくのですが。先は長そうです。

と書いたのですが、少し考え方を変えてトライしたらこれもクリアしました。似たようなことをなさる初心者の方もいらっしゃるかもしませんので、参考になるかはわかりませんが少しだけソースを書いておきます。

目的 特定の属性値を持っている複数の子ノードを含むノードを取得する(素人ゆえ用語もしくは関数の使い方に間違いがあるかもしれませんが、間違ってましたら容赦なくご指摘ください)

XML文書の大まかな構造
<pair>
<person sex="F" age="20" lang="english japanese">AAA</person>
<person sex="M" age="27" lang="english">BBB</person>
</pair>
<pair>
<person sex="F" age="29" lang="chinese">CCC</person>
<person sex="M" age="30" lang="english">DDD</person>
</pair>
<pair>
<person sex="F" age="27" lang="japanese">EEE</person>
<person sex="M" age="34" lang="italian">FFF</person>
</pair>

検索したいもの -> 日本語が話せる女性と英語が話せる男性からなるペア(上記の例ではAAAとBBBのペアです)。

検索に使用した式
'//pair[person[contains(@sex, "F") and contains(@lang, "japanese")] and person[contains(@sex, "M") and contains(@lang, "english")]]'


再び追加します。上記の例だと結果は

<pair>
<person sex="F" age="20" lang="english japanese">AAA</person>
<person sex="M" age="27" lang="english">BBB</person>
</pair>

となり、タグごと出てきます。AAAとBBBという名前だけ取得したい時は、またひと捻りしないといけませんね。まだ実験してません。


[ メッセージ編集済み 編集者: アバニ 編集日時 2005-10-28 18:43 ]

[ メッセージ編集済み 編集者: アバニ 編集日時 2005-10-28 18:59 ]
アバニ
会議室デビュー日: 2005/10/27
投稿数: 8
投稿日時: 2005-11-02 00:43
編集しても良かったのですが、新たにお尋ねしたいことがありますので別メッセージにさせていただきます。

今Googleのajaxsltでこのスレで質問したことと同じことをしようとしています。
式がperson[contains(@sex,'F') and contains(@lang,'japanese')というのはうまくいくのですが、前のメッセージで書いたような親ノード(pair)を出力させるような式だとうまくいきません。どなたかGoogleのajaxsltでうまく処理する方法をご存知の方いらっしゃいましたらヒントもしくはアドバイスをお願いします。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-11-02 11:10
ver.0.4 ですからー
検索しても、未実装ありで、不正な式でもエラー無しで何か返すとか。
式を少しずつ複雑にしてゆくと、わかるでしょう

contains(@sex,'F') は @sex = 'F' のほうが短い

xsltで吐き出た結果が ソースのノードなら、JavascriptのDOMで
parentのpairをつかめる、可能性はあります。
==================================================
ajax が操作している xml(DOM)は msxml が扱う DOM と同じ?

[ メッセージ編集済み 編集者: MMX 編集日時 2005-11-02 14:21 ]
アバニ
会議室デビュー日: 2005/10/27
投稿数: 8
投稿日時: 2005-11-02 12:09
MMXさま

ajaxsltについては最初の試みがうまくいったので少し調子に乗りすぎました。おっしゃる通りですね。今後に期待したいと思います。

検索の件ですが、ヒントをいただきましたJavascriptのDOMの線を探ってみたいと思います。素人丸出しの質問にご返信していただきありがとうございました。今後も宜しくお願いいたします。
1

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