Groß- und Kleinschreibung wird in xpath nicht berücksichtigt?


76

Zum Beispiel für die folgende XML

<CATALOG>
    <CD title="Empire Burlesque"/>
    <CD title="empire burlesque"/>
    <CD title="EMPIRE BURLESQUE"/>
    <CD title="EmPiRe BuRLeSQuE"/>
    <CD title="Others"/>
<CATALOG>

Wie man die ersten 4 Datensätze mit xpath like vergleicht //CD[@title='empire burlesque']. Gibt es dafür eine xpath-Funktion? Andere Lösungen wie die PHP-Funktion werden ebenfalls akzeptiert.


1
stackoverflow.com/questions/586231/… Schauen Sie sich Ben Gripkas Beitrag für xpath 1.0 an
user2237201

Hier habe ich auch 2 weitere Lösungen mit Beschreibung gefunden: (nicht meine Website / Promotion) codingexplained.com/coding/php/…
bharat

Antworten:


113

XPath 2 verfügt über eine Zeichenfolgenfunktion in Kleinbuchstaben (und Großbuchstaben). Das ist nicht ganz das Gleiche wie ohne Berücksichtigung der Groß- und Kleinschreibung, aber hoffentlich ist es nah genug:

//CD[lower-case(@title)='empire burlesque']

Wenn Sie XPath 1 verwenden, gibt es einen Hack mit translate .


Funktioniert sogar in XPath-Abfragen von SQL Server für XML-Spalten. Ausgezeichnet.
TJ Crowder

55

match () ist eine XPATH 2.0-Funktion, die eine Regex-Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung ermöglicht.

Eines der Flags dient izum Abgleichen ohne Berücksichtigung der Groß- und Kleinschreibung.

Der folgende XPATH verwendet die Funktion match () mit dem Flag ohne Berücksichtigung der Groß- und Kleinschreibung:

//CD[matches(@title,'empire burlesque','i')]

13
Dies ist Regex-basiert, was einen wichtigen Unterschied zum textbasierten Abgleich darstellt.
usr

12

Dies funktioniert in Chrome Developer-Tools nicht, um ein Element zu finden. Ich suche nach der Schaltfläche "Senden" auf dem Bildschirm

//input[matches(@value,'submit','i')]

Verwenden Sie jedoch "Übersetzen", um alle Kappen durch kleine Werke wie unten zu ersetzen

//input[translate(@value,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = 'submit']

Update: Ich habe gerade den Grund gefunden, warum "Übereinstimmungen" nicht funktionieren. Ich verwende Chrome mit xpath 1.0, das die Syntax "Übereinstimmungen" nicht versteht. Es sollte xpath 2.0 sein


Es scheint, dass das Übersetzungskonzept in Bezug auf die Internationalisierung als "
fallunabhängige

9

Eine mögliche PHP-Lösung:

// load XML to SimpleXML
$x = simplexml_load_string($xmlstr);

// index it by title once
$index = array();
foreach ($x->CD as &$cd) {
  $title = strtolower((string)$cd['title']); 
  if (!array_key_exists($title, $index)) $index[$title] = array();
  $index[$title][] = &$cd;
}

// query the index 
$result = $index[strtolower("EMPIRE BURLESQUE")];

11
An den anonymen Wähler: Lesen Sie die Frage des OP. Insbesondere die "Andere Lösungen wie die PHP-Funktion werden ebenfalls akzeptiert." Teil.
Tomalak

3

Sie haben erwähnt, dass PHP-Lösungen akzeptabel sind, und PHP bietet eine Möglichkeit, dies zu erreichen, obwohl es nur XPath v1.0 unterstützt. Sie können die XPath-Unterstützung erweitern, um PHP-Funktionsaufrufe zuzulassen.

$xpathObj = new DOMXPath($docObj);
$xpathObj->registerNamespace('php','http://php.net/xpath'); // (required)
$xpathObj->registerPhpFunctions("strtolower"); // (leave empty to allow *any* PHP function)
$xpathObj->query('//CD[php:functionString("strtolower",@title) = "empire burlesque"]');

Weitere Beispiele finden Sie in der Dokumentation zu PHP registerPhpFunctions . Es zeigt im Grunde, dass "php: function" für die boolesche Auswertung und "php: functionString" für die String-Auswertung ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.