wie bekomme ich die normalize-space () xpath Funktion?

8

Ich probiere gerade den folgenden xpath

aus %Vor%

um alle tr zu erhalten, die eine td enthalten, die 'User Name' oder 'User Name' oder ' User Name ' enthält, aber es funktioniert nicht und ich weiß nicht, was mit der Abfrage falsch ist :(
Die Daten, die ich finden möchte, haben folgendes Format:

%Vor%

Was ist das richtige Format zum Schreiben dieser XPath-Abfrage?

Bearbeiten: Es scheint nicht zu funktionieren, wenn die Daten das folgende Format haben:

%Vor%

so wie kann ich nun die xpath-abfrage schreiben?
Hinweis: "// tr [normalize-space (td / text ()) = 'Benutzername']" wird nicht funktionieren aber "// tr / td [normalize-space (text ()) = 'Benutzername']" wird funktionieren (aber ich möchte das tr- und nicht das td-Element erhalten)

    
Karim 01.12.2009, 21:49
quelle

2 Antworten

26

Nachdem Sie die Frage bearbeitet haben, ist es sinnvoll. Betrachten wir diese Eingabe:

%Vor%

und Ihre nicht funktionierende Abfrage:

%Vor%

Nun bedeutet td/text() "wählt alle untergeordneten Textknoten aller untergeordneten td Knoten des aktuellen Knotens aus". In diesem Fall ergibt sich ein Knotensatz bestehend aus zwei Textknoten, x und User Name .

Jetzt rufen Sie normalize-space() für diesen Knotensatz auf. Der Typ des einzigen Arguments von normalize-space() ist string? . Da ein Node-Set keine Zeichenfolge ist, treten Conversions gemäß Abschnitt 3.2 von XPath 1.0 ein Empfehlung:

  

Ein Argument wird wie durch Aufrufen der Funktion string () in den Typ string konvertiert.

Sehen wir uns nun die Definition von string () in Abschnitt 4.2 an:

  

Ein Knotensatz wird in eine Zeichenfolge konvertiert, indem der Zeichenfolgenwert des Knotens in der Knotengruppe zurückgegeben wird, die sich zuerst in der Dokumentreihenfolge befindet . Wenn der Knotensatz leer ist, wird eine leere Zeichenfolge zurückgegeben.

In unserem Beispiel ist der erste Knoten "in Dokumentenreihenfolge" der Textknoten x , also der, der verwendet wird; der zweite Knoten wird ignoriert. Sie rufen also normalize-space('x') auf. Natürlich wird dies nicht mit "Benutzername" verglichen. Verwenden Sie dazu:

%Vor%

Dies kann wie folgt überschrieben werden: "select all tr nodes, die untergeordnete td Knoten haben, wobei der erste untergeordnete Knoten text() einen normalisierten Zeichenfolgenwert von User Name hat" - was Sie wollen. Darüber hinaus können Sie dies vereinfachen:

%Vor%

Da für den aktuellen Knoten ein No-Argument normalize-space() gilt (das ist td ), und alle Textknoten darin verarbeiten.

    
Pavel Minaev 01.12.2009, 22:35
quelle
1

Das funktioniert hier gut:

%Vor%

Können Sie Ihre Frage bitte mit einem aktuellen XML-Beispiel aktualisieren?

    
Rubens Farias 01.12.2009 22:07
quelle

Tags und Links