Usando uma consulta xpath, como você descobre se existe um nó (tag)?
Por exemplo, se eu precisasse garantir que uma página de site tivesse a estrutura básica correta, como / html / body e / html / head / title
Usando uma consulta xpath, como você descobre se existe um nó (tag)?
Por exemplo, se eu precisasse garantir que uma página de site tivesse a estrutura básica correta, como / html / body e / html / head / title
Respostas:
<xsl:if test="xpath-expression">...</xsl:if>
então por exemplo
<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())
(ou seja, apenas teste se existe e se não contém nós filhos ou nós de texto).
Tente a seguinte expressão: boolean(path-to-node)
Patrick está correto, tanto no uso de xsl:if
quanto na sintaxe para verificar a existência de um nó. No entanto, como a resposta de Patrick implica, não há xsl equivalente a if-then-else, portanto, se você está procurando algo mais como um if-then-else, normalmente é melhor usar xsl:choose
e xsl:otherwise
. Portanto, a sintaxe de exemplo de Patrick funcionará, mas esta é uma 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
, e também if-else if-else
? Na resposta de davenpcj posso colocar test="somexpath"
no 2º quando fazê-lo if-else if-else
?
Pode ser melhor usar uma opção, não precisar digitar (ou possivelmente digitar incorretamente) suas expressões mais de uma vez e permitir que você siga comportamentos diferentes adicionais.
Eu costumo usar count(/html/body) = 0
, pois o número específico de nós é mais interessante que o conjunto. Por exemplo ... quando houver inesperadamente mais de um nó que corresponda à sua expressão.
<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
gênio! : DI usá-lo como /html[count(/body)=0]/someNode
para selecionar someNode
quando /body
(ou qualquer outro) está faltando
/html[count(/body)=0]
nunca selecionará nada, não pode haver dois nós raiz no XML. Talvez você quis dizer /html[count(body)=0]
, o que seria o mesmo que /html[not(body)]
, ou /html[not(exists(body))]
.
Eu trabalho em Ruby e usando Nokogiri eu pego o elemento e procuro ver se o resultado é 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?
Uma variação ao usar xpath em Java usando count ():
int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
// body node missing
}