2017-06-13 4 views
3

私はpタグを取得しようとしていますが、成功していません。以下は私が得ようとしているデータです。XPATHで特定のタグを取得するにはどうすればよいですか?

for $i in $data 
    let $ptag := $i//*[p]/text() 

    (: $data example :) 
    <div xmlns="http://www.w3.org/1999/xhtml"> 
    <div class="title">my title</div> 
    <div class="course"> 
     <div class="room">112</div> 
     <div class="teacher">Mr. Wilson</div> 
     <div class="student">123456</div> 
     <p>approved</p> 
    </div> 
    </div> 
+1

あなたは '// P /テキスト()'や '// * [名前()= "P"] /テキストを()'試したことがありますか? – Andersson

+0

ありがとう! // * [name()= "p"/text()は機能しました。 – Jon

答えて

6

2つの問題:

  1. p要素はXHTML名前空間にバインドされています。 "名前空間なし"の "p"という名前の要素を参照しています。 XHTML名前空間を宣言し、XPathでnamespace-prefixを使用します。
  2. 述部(角カッコ)は、SQL where句のように動作し、角カッコの前の項目のfilteresです。元のXPathは、すべてのXHTML p要素のtext()ノードをすべて選択するのではなく、p子要素を持つ$dataの要素からすべてのtext()ノードを処理しようとしていました。

(: declare a namespace prefix for the XHTML namespace, 
    in order to use in the XPath below :) 
declare namespace x="http://www.w3.org/1999/xhtml"; 

(: $data example :) 
let $data := 
    <div xmlns="http://www.w3.org/1999/xhtml"> 
    <div class="title">my title</div> 
    <div class="course"> 
     <div class="room">112</div> 
     <div class="teacher">Mr. Wilson</div> 
     <div class="student">123456</div> 
     <p>approved</p> 
    </div> 
    </div> 

return 
    for $i in $data 
    (: use the namespace prefix "x" when addressing the HTML p element 
    and pull it out of the predicate 
    :) 
    let $ptag := $i//x:p/text() 
    return $ptag 
関連する問題