4 Stimmen

Die XPath-Funktionen normalize-space() und starts-with() finden kein Element mit   direkt vor dem Element

Ich habe ein Stück eines solchen HTML-Codes

<td>
<a href="CMenu?op=m&menuID=42&rurl={{rurl}}" title="Edit menu">
<img border="0" alt="" src="Images/application.gif">
&nbsp;Case
</a>
</td>

und müssen den Text "Case" finden.
Ich verwende verschiedene XPath-Abfragen, aber keine davon ist gut, alle finden nichts:

//a[text() = ' Case']
//a[text() = 'Case']
//td/a[normalize-space(text()) = 'Case']
//td[a[normalize-space(.) = 'Case']]
//td[a[normalize-space(text()) = 'Case']]
//*[starts-with(.," Case")]
//*[starts-with(.,"Case")]

Aber wenn ich versuche, diesen Artikel mit

//a[contains(.,'Case') and string-length() = 5]

Es funktioniert, aber ich kann nicht akzeptieren, harten Code "5", ich möchte diese XPath Mehrzweck für andere relative Elemente zu machen.
Und wenn ich die

//a[contains(.,'Case')]

Ich finde eine Liste von Elementen, die "Case" enthalten, brauche aber nur eines mit "Case" und nicht mehr Zeichen. Vielleicht mache ich etwas falsch, nur wollen es klar zu mir zu nehmen.


Mein Kollege sagt mir, dass ich diesen einen XPath verwenden kann

//a[substring(text(),2)='Case']

Überspringen Sie einfach diese Stelle. Ich finde heraus, dass es funktioniert, aber es scheint mir, dass es einen anderen Weg gibt, mein Problem zu lösen, ohne zu überspringen oder zu passieren.

4voto

Dimitre Novatchev Punkte 234995

Verwenden Sie :

/td/a
      [starts-with(normalize-space(), '&#xA0;Case')]

XPath ist nicht entitätenorientiert und normalize-space() verarbeitet per Definition nur Leerzeichen : Leerzeichen, NL, CR und Tab -- also &#xA0; (das ist das, was die Entität &nbsp; wird erweitert) wird nicht als Leerzeichen betrachtet.

XSLT-gestützte Überprüfung :

Diese Transformation selektiert mit dem obigen XPath-Ausdruck und gibt das Ergebnis aus :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "/td/a
      [starts-with(normalize-space(), '&#xA0;Case')]
   "/>
 </xsl:template>
</xsl:stylesheet>

bei Anwendung auf das bereitgestellte XML-Dokument :

<td>
<a href="CMenu?op=m&amp;menuID=42&amp;rurl={{rurl}}" title="Edit menu">
<img border="0" alt="" src="Images/application.gif"/>
&#xA0;Case
</a>
</td>

das gewünschte, korrekte Ergebnis erzielt wird :

<a href="CMenu?op=m&amp;menuID=42&amp;rurl={{rurl}}" title="Edit menu">
  <img border="0" alt="" src="Images/application.gif" />
 Case
</a>

0voto

Mike Sokolov Punkte 6684

Sie können auch //a[matches(., '^ \W *Fall \W *$')], das einem Element mit dem Wert "Case" entspricht, das möglicherweise von anderen Nicht-Wort-Zeichen umgeben ist (alles außer Buchstaben, Zahlen und _, glaube ich).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X