Dotyczy to XPath 1.0. Jeśli Twoje środowisko obsługuje XPath 2.0, zobacz tutaj .
Tak. Możliwe, ale nie piękne.
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
To zadziała w przypadku ciągów wyszukiwania, w przypadku których alfabet jest wcześniej znany. Dodaj znaki akcentowane, które spodziewasz się zobaczyć.
Jeśli możesz, oznacz tekst, który Cię interesuje, innymi sposobami, na przykład umieszczając go w elemencie, <span>
który ma określoną klasę podczas tworzenia kodu HTML. Takie rzeczy są znacznie łatwiejsze do zlokalizowania za pomocą XPath niż podciągi w tekście elementu.
Jeśli to nie jest możliwe, możesz pozwolić JavaScript (lub jakiemukolwiek innemu językowi hosta, którego używasz do wykonywania XPath), aby pomóc Ci w tworzeniu dynamicznego wyrażenia XPath:
function xpathPrepare(xpath, searchString) {
return xpath.replace("$u", searchString.toUpperCase())
.replace("$l", searchString.toLowerCase())
.replace("$s", searchString.toLowerCase());
}
xp = xpathPrepare("//text()[contains(translate(., '$u', '$l'), '$s')]", "Test");
(Wskazówka dotycząca kapelusza do odpowiedzi @ KirillPolishchuk - oczywiście wystarczy przetłumaczyć tylko te znaki, których faktycznie szukasz ).
Takie podejście zadziałałoby dla dowolnego ciągu wyszukiwania, bez konieczności wcześniejszej znajomości alfabetu, co jest dużym plusem.
Obie powyższe metody zawodzą, gdy ciągi wyszukiwania mogą zawierać pojedyncze cudzysłowy, w takim przypadku sprawy stają się bardziej skomplikowane .
translate()
sam nie dba o to, jak często powtarzasz każdy znak -translate(., 'EE', 'ee')
jest absolutnie równoważnytranslate(., 'E', 'e')
. PS: Nie zapomnij zagłosować za @KirillPolishchuk, pomysł był jego.Piękniejsza:
/html/body//text()[contains(translate(., 'TES', 'tes'), 'test')]
źródło
TEST
siętest
i nie pozostawiTest
tak, jak jest?translate(., 'TES', 'tes')
. W ten sposób ludzie zdadzą sobie sprawę, że to nie jest tłumaczenie słów, tylko tłumaczenie liter.Rozwiązania XPath 2.0
Posługiwać się małych liter () :
/html/body//text()[contains(lower-case(.),'test')]
Użyj dopasowania () wyrażenia regularnego z flagą bez rozróżniania wielkości liter:
/html/body//text()[matches(.,'test', 'i')]
źródło
Tak. Możesz użyć
translate
do konwersji tekstu, który chcesz dopasować, na małe litery w następujący sposób:/html/body//text()[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'test')]
źródło
Jeśli używasz XPath 2.0, możesz określić sortowanie jako trzeci argument funkcji zawiera (). Jednak identyfikatory URI sortowania nie są ustandaryzowane, więc szczegóły zależą od używanego produktu.
Zwróć uwagę, że wszystkie rozwiązania podane wcześniej przy użyciu translate () zakładają, że używasz tylko 26-literowego alfabetu angielskiego.
AKTUALIZACJA: XPath 3.1 definiuje standardowy identyfikator URI sortowania dla dopasowywania z rozróżnianiem wielkości liter.
źródło
Sposób, w jaki zawsze to robiłem, polegał na użyciu funkcji „translate” w XPath. Nie powiem, że jest bardzo ładny, ale działa poprawnie.
/html/body//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLOMNOPQRSTUVWXYZ'),'TEST')]
mam nadzieję że to pomoże,
źródło