2011-07-25 28 views
1

<strong></strong>タグの間に3番目の検索(「Practice Guidelines Professional」の検索)が機能しません。テキスト間でHTMLタグをバイパスするには?HTMLタグによるXPath検索

<html> 
<head> 
<meta http-equiv="X-UA-Compatible" content="chrome=1"> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<meta name="apple-mobile-web-app-capable" content="yes"> 
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> 
<title>Xpath Test</title> 

<script type="text/javascript"> 
var search = function (button) { 
    var searchTxt = button.value; 
    var xpath = '//*[contains(translate(text(),\'ABCDEFGHIJKLMNOPQRSTUVWXYZ\', \'abcdefghijklmnopqrstuvwxyz\'), \'' + searchTxt.toLowerCase() + '\')]'; 
    var nodes = null; 

    if (document.evaluate) { 
     nodes = document.evaluate(
      xpath, 
      document, 
      null, 
      XPathResult.ORDERED_NODE_ITERATOR_TYPE, 
      null 
     ); 

     var node = nodes.iterateNext(); 
     if (node) { 
      while (node) { 
       var nodeXpath = createXPathFromElement(node); 
       alert("Found!!!\n xpath: " + nodeXpath); 
       node = nodes.iterateNext(); 
      } 
     } else { 
      alert("No results found."); 
     } 
    } else { 
     alert("Your browser does not support the evaluate method!"); 
    } 
    } 

    function createXPathFromElement(elm) { 
    var allNodes = document.getElementsByTagName('*'); 
    for (segs = []; elm && elm.nodeType == 1; elm = elm.parentNode) 
    { 
     for (i = 1, sib = elm.previousSibling; sib; sib = sib.previousSibling) { 
      if (sib.localName == elm.localName) i++; 
     }; 
     segs.unshift(elm.localName.toLowerCase() + '[' + i + ']'); 
    }; 
    return segs.length ? '//' + segs.join('//') : null; 
    } 
</script> 
</head> 

<body> 
<table> 
    <tr> 
     <td> 
      <p>&#160;</p><h3><strong><span class="color-1">PRINCIPLES OF PATIENT CARE</span></strong></h3><p class="noindent"><strong><span class="color-1">Evidence-Based Medicine</span></strong> Evidence-based medicine refers to the concept that clinical decisions are formally supported by data, preferably data that are derived from prospectively designed, randomized, controlled clinical trials. This is in sharp contrast to anecdotal experience, which may often be biased. Unless they are attuned to the importance of using larger, more objective studies for making decisions, even the most experienced physicians can be influenced by recent encounters with selected patients. Evidence-based medicine has become an increasingly important part of the routine practice of medicine and has led to the publication of a number of practice guidelines.</p> 
      <p>&#160;</p><p class="noindent"><strong><span class="color-1">Practice Guidelines</span></strong> Professional organizations and government agencies are developing formal clinical-practice guidelines to aid physicians and other caregivers in making diagnostic and therapeutic decisions that are evidence-based, cost-effective, and most appropriate to a particular patient and clinical situation. As the evidence base of medicine increases, guidelines can provide a useful framework for managing patients with particular diagnoses or symptoms. They can protect patients—particularly those with inadequate health care benefits—from receiving substandard care. Guidelines can also protect conscientious caregivers from inappropriate charges of malpractice and society from the excessive costs associated with the overuse of medical resources. There are, however, caveats associated with clinical practice guidelines since they tend to oversimplify the complexities of medicine. Furthermore, groups with differing perspectives may develop divergent recommendations regarding issues as basic as the need for periodic sigmoidoscopy in middle-aged persons. Finally, guidelines do not—and cannot be expected to—account for the uniqueness of each individual and his or her illness. The physician’s challenge is to integrate into clinical practice the useful recommendations offered by experts without accepting them blindly or being inappropriately constrained by them.</p>    
     </td> 
    </tr> 
    <tr> 
     <td> 
      Search for <input type="button" onclick="search(this)" value="Practice Guidelines" /> Success. 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Search for <input type="button" onclick="search(this)" value="Professional" /> Success. 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Search for <input type="button" onclick="search(this)" value="Practice Guidelines Professional" /> No result since text 'Practice Guidelines' is inside &lt;strong&gt;&lt;strong/&gt;, and 'Professional' is out side.  
     </td> 
    </tr> 
</table> 
</body> 
</html> 

答えて

0

はい。これにはnormalize-space()を使用できます。 (ラインラップ読みやすさのために)

var xpath = " 
    //*[ 
    contains(
     translate(
     normalize-space(.), 
     'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
     'abcdefghijklmnopqrstuvwxyz' 
    ), 
     normalize-space('" + searchTxt.toLowerCase() + "') 
    ) 
    ] 
"; 

注これが最大と<html>要素を含め、それぞれのテキストを含むノードの階層全体を見つけること。あなたは "最も深くネストされた"ノードに興味があると思います。

また、単一引用符をsearchTxtから削除すると、XPath式が壊れる可能性があります。

+0

ご協力いただきありがとうございます。 – Jagadeesan

0

ルート要素のtextContent/innerHTMLを見て、一致するものがあるかどうかを調べる再帰的な方法もあります。そうであれば、一致するfirstChildノードに移動し、一致が失敗するまで子供の後に続きます。その時点で、テキストを含む要素が見つかりました。

テキストとの複数の一致に対しても機能する必要があります。

XPathの方が速いかもしれませんが、おそらくそれほど荒々しくはサポートされていない可能性があります(現代のブラウザではそうですが)。

+0

ありがとう... :) – Jagadeesan