Usando una consulta xpath, ¿cómo encuentra si existe un nodo (etiqueta)?
Por ejemplo, si necesitaba asegurarme de que la página de un sitio web tenga la estructura básica correcta como / html / body y / html / head / title
Usando una consulta xpath, ¿cómo encuentra si existe un nodo (etiqueta)?
Por ejemplo, si necesitaba asegurarme de que la página de un sitio web tenga la estructura básica correcta como / html / body y / html / head / title
Respuestas:
<xsl:if test="xpath-expression">...</xsl:if>
así por ejemplo
<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())
(es decir, simplemente pruebe si existe y no contiene ningún nodo secundario o nodo de texto).
Pruebe la siguiente expresión: boolean(path-to-node)
Patrick tiene razón, tanto en el uso de xsl:if
, como en la sintaxis para verificar la existencia de un nodo. Sin embargo, como implica la respuesta de Patrick, no hay un equivalente xsl de if-then-else, por lo que si está buscando algo más como if-then-else, normalmente es mejor usar xsl:choose
y xsl:otherwise
. Entonces, la sintaxis de ejemplo de Patrick funcionará, pero esta es una 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
, ¿y qué pasa también if-else if-else
? En la respuesta de davenpcj, ¿puedo colocar test="somexpath"
en el segundo cuándo hacerlo if-else if-else
?
Podría ser mejor usar una opción, no tiene que escribir (o posiblemente escribir mal) sus expresiones más de una vez, y le permite seguir comportamientos diferentes adicionales.
A menudo lo uso count(/html/body) = 0
, ya que el número específico de nodos es más interesante que el conjunto. Por ejemplo ... cuando hay inesperadamente más de 1 nodo que coincide con su expresión.
<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 lo uso /html[count(/body)=0]/someNode
para seleccionar someNode
cuándo /body
falta (o lo que sea)
/html[count(/body)=0]
nunca seleccionará nada, no puede haber dos nodos raíz en XML. Quizás quisiste decir /html[count(body)=0]
, que sería lo mismo que /html[not(body)]
, o /html[not(exists(body))]
.
Trabajo en Ruby y usando Nokogiri busco el elemento y miro para ver si el resultado es nulo.
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 variación al usar xpath en Java usando count ():
int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
// body node missing
}