webentwicklung-frage-antwort-db.com.de

zwischen Groß- und Kleinschreibung in xpath?

Zum Beispiel für die unten stehende XML

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

So gleichen Sie die ersten 4 Datensätze mit xpath wie //CD[@title='empire burlesque'] Ab. Gibt es eine xpath-Funktion, um dies zu tun? Andere Lösungen wie PHP function werden ebenfalls akzeptiert.

66
Ethan

XPath 2 verfügt über eine Zeichenfolgenfunktion in Kleinbuchstaben (und in Großbuchstaben). Das ist nicht ganz dasselbe wie Groß- und Kleinschreibung, aber es wird hoffentlich nah genug sein:

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

Wenn Sie XPath 1 verwenden, gibt es ein Hack using translate .

101

matches () ist eine XPATH 2.0-Funktion, bei der zwischen Groß- und Kleinschreibung unterschieden werden kann.

Eines der Flags ist i für eine Übereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung.

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

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

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")];
9
Tomalak

Dies funktioniert nicht in Chrome Entwickler-Tools zum Auffinden eines Elements. Ich suche nach der Schaltfläche "Senden" auf dem Bildschirm

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

Verwenden Sie jedoch 'translate', um alle Großbuchstaben für kleine Werke zu ersetzen (siehe unten)

//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 'matches' nicht versteht. Es sollte xpath 2.0 sein

8
Bhuvanesh Mani

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 XPath erweitern Unterstützung für PHP Funktionsaufrufe.

$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 PHP registerPhpFunctions . Grundsätzlich wird gezeigt, dass "php: function" für die Boolesche Auswertung und "php: functionString" für die String-Auswertung vorgesehen ist.

2
jimp