xpath trova se il nodo esiste


201

Utilizzando una query xpath come si trova se esiste un nodo (tag)?

Ad esempio, se avessi bisogno di assicurarmi che una pagina del sito Web avesse la struttura di base corretta come / html / body e / html / head / title


Forse è meglio usare lo schema XML con indicazione degli elementi obbligatori? Quindi controlla che un documento lo usi o meno.
abatishchev,

Risposte:


321
<xsl:if test="xpath-expression">...</xsl:if>

quindi per esempio

<xsl:if test="/html/body">body node exists</xsl:if>
<xsl:if test="not(/html/body)">body node missing</xsl:if>

41
Sorpreso da un punteggio così alto dato che la domanda non specifica affatto l'uso di XSLT.
tjmoore,

Questo è fantastico ma cosa succede se volessi verificare se esiste O vuoto?
SearchForKnowledge

3
@SearchForKnowledge, probabilmente dovresti porlo come una nuova domanda a SO, ma come una guida rapida: html/body and not(html/body/node())(cioè, prova solo se esiste e non contiene nodi figlio o nodi di testo).
Abel,

71

Prova la seguente espressione: boolean(path-to-node)


3
Questo è esattamente ciò di cui avevo bisogno quando usavo XPath in Python con lxml.
Iain Samuel McLean Elder,

1
Questo ha funzionato a meraviglia nel costruire le Condizioni delle Regole e le Azioni delle Regole all'interno di InfoPath 2010.
Merenzo

3
Questa è la risposta corretta nel senso che questa è in realtà una query XPath, a differenza della maggior parte delle altre risposte.
Paul Etherton,

48

Patrick ha ragione, sia nell'uso di xsl:if, sia nella sintassi per verificare l'esistenza di un nodo. Tuttavia, come suggerisce la risposta di Patrick, non esiste un xsl equivalente a if-then-else, quindi se stai cercando qualcosa di più simile a un if-then-else, normalmente stai meglio usando xsl:choosee xsl:otherwise. Quindi, la sintassi di esempio di Patrick funzionerà, ma questa è un'alternativa:

<xsl:choose>
 <xsl:when test="/html/body">body node exists</xsl:when>
 <xsl:otherwise>body node missing</xsl:otherwise>
</xsl:choose>

+1 per notare if-then-else, anche che dire if-else if-else? Nella risposta di davenpcj posso inserire test="somexpath"il 2 ° quando farlo if-else if-else?
AabinGunz,

3
@Abhishek Sì, puoi aggiungere più xsl: quando hai altre condizioni e avere un'istruzione multi-branch. Pensalo più come un SELECT che un if-then-else, con xsl: altrimenti come predefinito :.
davenpcj,

Questo è fantastico ma cosa succede se volessi verificare se esiste O vuoto?
SearchForKnowledge

13

Potrebbe essere meglio usare una scelta, non è necessario digitare (o possibilmente digitare male) le tue espressioni più di una volta e ti consente di seguire ulteriori comportamenti diversi.

Uso molto spesso count(/html/body) = 0, poiché il numero specifico di nodi è più interessante dell'insieme. Ad esempio ... quando c'è inaspettatamente più di 1 nodo che corrisponde alla tua espressione.

<xsl:choose>
    <xsl:when test="/html/body">
         <!-- Found the node(s) -->
    </xsl:when>
    <!-- more xsl:when here, if needed -->
    <xsl:otherwise>
         <!-- No node exists -->
    </xsl:otherwise>
</xsl:choose>

Come indicato nel codice sopra, più xsl: quando è possibile aggiungere clausole per modificare il comportamento e gestire più condizioni in diversi modi.
davenpcj,

count(/html/body) = 0 genio! : DI usalo come /html[count(/body)=0]/someNodeper selezionare someNodequando /body(o qualunque cosa) manchi
Stefan Rogin

1
@clickstefan, /html[count(/body)=0]non selezionerà mai nulla, non ci possono essere due nodi root in XML. Forse intendevi /html[count(body)=0], che sarebbe lo stesso di /html[not(body)]o /html[not(exists(body))].
Abele,

@Abel sì, / html [count (// body) = 0] o come hai detto, vergognoso ma sì, non ho dato un esempio corretto
Stefan Rogin,

4

Lavoro in Ruby e usando Nokogiri prendo l'elemento e cerco di vedere se il risultato è zero.

require 'nokogiri'

url = "http://somthing.com/resource"

resp = Nokogiri::XML(open(url))

first_name = resp.xpath("/movies/actors/actor[1]/first-name")

puts "first-name not found" if first_name.nil?

3

Una variante quando si utilizza xpath in Java usando count ():

int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
    // body node missing
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.