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
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
Risposte:
<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>
html/body and not(html/body/node())
(cioè, prova solo se esiste e non contiene nodi figlio o nodi di testo).
Prova la seguente espressione: boolean(path-to-node)
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:choose
e 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>
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
?
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>
count(/html/body) = 0
genio! : DI usalo come /html[count(/body)=0]/someNode
per selezionare someNode
quando /body
(o qualunque cosa) manchi
/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))]
.
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?
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
}