Используя запрос xpath, как определить, существует ли вообще какой-либо узел (тег)?
Например, если мне нужно убедиться, что страница сайта имеет правильную базовую структуру, такую как / html / body и / html / head / title
Используя запрос xpath, как определить, существует ли вообще какой-либо узел (тег)?
Например, если мне нужно убедиться, что страница сайта имеет правильную базовую структуру, такую как / html / body и / html / head / title
Ответы:
<xsl:if test="xpath-expression">...</xsl:if>
так например
<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())
(т.е. просто проверьте, существует ли он и не содержит ли он дочерних узлов или текстовых узлов).
Попробуйте следующее выражение: boolean(path-to-node)
Патрик прав как в использовании xsl:if
синтаксиса, так и в синтаксисе для проверки существования узла. Однако, как показывает ответ Патрика, xsl-эквивалента if-then-else нет, поэтому, если вы ищете что-то более похожее на if-then-else, вам, как правило, лучше использовать xsl:choose
и xsl:otherwise
. Итак, пример синтаксиса Патрика будет работать, но это альтернатива:
<xsl:choose>
<xsl:when test="/html/body">body node exists</xsl:when>
<xsl:otherwise>body node missing</xsl:otherwise>
</xsl:choose>
if-then-else
, а как насчет if-else if-else
? В ответе davenpcj я могу поставить test="somexpath"
во 2-й, когда это сделать if-else if-else
?
Может быть, лучше использовать выбор, не нужно вводить (или, возможно, неправильно вводить) свои выражения более одного раза, и это позволяет вам следовать дополнительному другому поведению.
Я очень часто пользуюсь count(/html/body) = 0
, так как конкретное количество узлов интереснее, чем множество. Например ... когда неожиданно найдется более одного узла, соответствующего вашему выражению.
<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
гений! : D Я использую его как /html[count(/body)=0]/someNode
для выбора, someNode
когда /body
(или что-то еще) отсутствует
/html[count(/body)=0]
никогда ничего не выберет, в XML не может быть двух корневых узлов. Может быть, вы имели в виду /html[count(body)=0]
, что будет так же, как /html[not(body)]
или /html[not(exists(body))]
.
Я работаю в Ruby и с помощью Nokogiri извлекаю элемент и проверяю, равен ли результат нулю.
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?
Вариант при использовании xpath в Java с использованием count ():
int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
// body node missing
}