2010-06-08 26 views
50

W tym XML, chcę, aby dopasować element zawierających „mecz” (pierwiastek random2)XPath zwraca tylko elementy zawierające tekst, a nie jego rodzice

<root> 
<random1> 
    <random2>match</random2> 
    <random3>nomatch</random3> 
</random1> 
</root> 

ok, do tej pory mam:

//[re:test(.,'match','i')] (with re in the proper namespace) 

ta zwraca random2, wyrywkowo1 i korzeń ... chciałbym dostać tylko "random2"

jakieś pomysły?

+0

Szukasz dopasować jeśli zawiera słowo w dowolnym miejscu w tekście (np „zobaczyć, czy to będzie * mecz * słowo”), albo tylko elementy, które mają wartość równą „mecz "(ignorując otaczające białe spacje)? –

+0

To nie jest tak istotne, albo by działało. Problem polegał głównie na tym, że zwracali oni także swoich rodziców. – julian

Odpowiedz

99

Chcesz znaleźć elementy, które zawierają "mecz", albo że równe "mecz"?

ten znajdzie elementy, które mają węzły tekstowe, że równe „mecz” (mecze żaden z elementów ze względu na początkowe i końcowe spacje w random2):

//*[text()='match'] 

ten znajdzie wszystkie elementy które mają węzły tekstowe, które są równe "dopasowanie", po usunięciu początkowych i końcowych białych znaków (odpowiada random2):

//*/text()[normalize-space(.)='match']/parent::* 

Pozwoli to znaleźć wszystkie elementy, które zawierają 'mecz' wartości węzła text (mecze random2 i random3):

//*[contains(text(),'match')] 

Ten XPATH 2,0 rozwiązanie wykorzystuje mecze() funkcja i wzór regex, który wyszukuje węzły tekstowe, które zawierają "dopasowanie" i rozpoczyna się na początku ciągu (np ^) lub granicę słowa (to znaczy \W) i zakończony przez koniec ciągu (tj. $) lub granicę słowa. Trzeci parametr i oblicza niewrażliwy na wielkość liter wzór regex. (Mecze random2)

//*[matches(text(),'(^|\W)match($|\W)','i')] 
+0

Twoje drugie zdanie nie jest prawdziwe. Wskazówka: weź element z więcej niż jednym węzłem tekstowym, którego pierwszy węzeł tekstowy nie zawiera "dopasowania". –

+0

Dzięki @Dimitre. Zaktualizowałem go czymś, co powinno być bardziej niezawodne. –

+0

rzeczywiście chcę uruchomić konkretne zapytanie z wyrażeniem regularnym, takie jak '^ ma (t | T). *' Mogę użyć pierwszego? //*[text()='^ma(t|T).* '] prawda? – julian

Powiązane problemy