2009-04-20 17 views
182

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

Per esempio, se avevo bisogno di assicurarsi che una pagina del sito ha la struttura di base corretta come/html/corpo e/html/capo/titolo

+0

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

risposta

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

così per esempio

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

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

+0

È fantastico ma se volessi controllare se esiste O vuoto? – SearchForKnowledge

+3

@SearchForKnowledge, dovresti probabilmente chiederlo come una nuova domanda su SO, ma come guida rapida: 'html/body e non (html/body/node())' (cioè, prova solo se esiste e non contenere eventuali nodi figli o nodi di testo). – Abel

2

A variazione quando si utilizza XPath in Java utilizzando count():

int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc)); 
if(numberofbodies==0) { 
    // body node missing 
} 
+0

Questo ha funzionato molto bene! –

64

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

+3

Questo è esattamente ciò di cui avevo bisogno quando utilizzo XPath in Python con lxml. –

+1

Questo ha funzionato durante la costruzione di regole e azioni di regole all'interno di InfoPath 2010. – Merenzo

+3

Questa è la risposta corretta nel senso che si tratta in realtà di una query XPath, diversamente dalla maggior parte delle altre risposte. –

11

potrebbe essere meglio usare una scelta, non c'è bisogno di digitare (o forse mistype) le espressioni più di una volta, e consente di seguire i comportamenti supplementari diverse.

Io molto spesso uso count(/html/body) = 0, in quanto il numero specifico di nodi è più interessante del set. Ad esempio ... quando c'è inaspettatamente più di un 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> 
+0

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

+0

'count (/ html/body) = 0' genius! : D Lo uso come '/ html [count (/ body) = 0]/someNode' per selezionare' someNode' quando '/ body' (o qualsiasi altra cosa) manca –

+1

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

38

Patrick è corretta, sia nell'uso del xsl:if, e nella sintassi per verificare l'esistenza di un nodo. Tuttavia, come implica la risposta di Patrick, non esiste xsl equivalente a if-then-else, quindi se stai cercando qualcosa di più come un if-then-else, normalmente stai meglio usando xsl:choose e xsl:otherwise. Così, la sintassi 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> 
+0

+1 per aver notato 'if-then-else', anche per quanto riguarda' if-else if-else'? Nella risposta di davenpcj posso inserire 'test =" somexpath "' nel secondo quando renderlo 'if-else if-else'? – abi1964

+3

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

+0

È fantastico ma se volessi controllare se esiste O vuoto? – SearchForKnowledge

3

Io lavoro in Ruby e utilizzando Nokogiri vado a prendere l'elemento e guardare per vedere se il risultato è pari a 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? 
Problemi correlati