Dies ist für XPath 1.0. Wenn Ihre Umgebung XPath 2.0 unterstützt, lesen Sie hier .
Ja. Möglich, aber nicht schön.
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
Dies würde für Suchzeichenfolgen funktionieren, bei denen das Alphabet vorher bekannt ist. Fügen Sie alle Zeichen mit Akzent hinzu, die Sie erwarten.
Wenn Sie können, markieren Sie den Text, der Sie interessiert, mit anderen Mitteln, z. B. indem Sie ihn <span>
beim Erstellen des HTML- Codes in einen Text einschließen , der eine bestimmte Klasse hat. Solche Dinge sind mit XPath viel einfacher zu finden als Teilzeichenfolgen im Elementtext.
Wenn dies keine Option ist, können Sie JavaScript (oder eine andere Hostsprache, mit der Sie XPath ausführen) beim Erstellen eines dynamischen XPath-Ausdrucks unterstützen:
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");
// -> "//text()[contains(translate(., 'TEST', 'test'), 'test')]"
( Hutspitze zu @ KirillPolishchuks Antwort - natürlich müssen Sie nur die Zeichen übersetzen, nach denen Sie tatsächlich suchen .)
Dieser Ansatz würde für jede Suchzeichenfolge funktionieren, ohne dass Vorkenntnisse des Alphabets erforderlich sind, was ein großes Plus ist.
Beide oben genannten Methoden schlagen fehl, wenn Suchzeichenfolgen einfache Anführungszeichen enthalten können. In diesem Fall werden die Dinge komplizierter .
translate()
selbst ist es egal, wie oft Sie jedes Zeichen wiederholen -translate(., 'EE', 'ee')
ist absolut gleichbedeutend mittranslate(., 'E', 'e')
. PS: Vergiss nicht, @KirillPolishchuk zu stimmen, die Idee war seine.Schöner:
quelle
TEST
zutest
und lassen ,Test
wie es ist?translate(., 'TES', 'tes')
. Auf diese Weise werden die Leute erkennen, dass es sich nicht um eine Wortübersetzung handelt, sondern um eine Buchstabenübersetzung.XPath 2.0-Lösungen
Verwenden Sie Kleinbuchstaben () :
/html/body//text()[contains(lower-case(.),'test')]
Verwenden Sie match () Regex Matching mit dem Flag, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird:
/html/body//text()[matches(.,'test', 'i')]
quelle
Ja. Sie können
translate
den Text, den Sie abgleichen möchten, wie folgt in Kleinbuchstaben konvertieren:quelle
Wenn Sie XPath 2.0 verwenden, können Sie eine Kollatierung als drittes Argument für enthalten () angeben. Kollatierungs-URIs sind jedoch nicht standardisiert, sodass die Details von dem von Ihnen verwendeten Produkt abhängen.
Beachten Sie, dass die zuvor mit translate () angegebenen Lösungen davon ausgehen, dass Sie nur das englische Alphabet mit 26 Buchstaben verwenden.
UPDATE: XPath 3.1 definiert einen Standard-Kollatierungs-URI für den fallblinden Abgleich.
quelle
Ich habe das immer mit der Funktion "Übersetzen" in XPath gemacht. Ich werde nicht sagen, dass es sehr hübsch ist, aber es funktioniert richtig.
hoffe das hilft,
quelle