Xpath найти, если node существует

Используя запрос xpath, как вы обнаруживаете, существует ли node (тег)?

Например, если мне нужно убедиться, что страница сайта имеет правильную базовую структуру, например /html/body и/html/head/title

Ответ 1

<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>

Ответ 2

Попробуйте следующее выражение: boolean(path-to-node)

Ответ 3

Патрик прав, как при использовании xsl:if, так и в синтаксисе для проверки существования node. Однако, как следует из ответа Патрика, нет 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>

(отредактировано не менее 6 символов)

Ответ 4

Может быть, лучше использовать выбор, не нужно печатать (или, возможно, ошибочно) ваши выражения более одного раза, и позволяет вам следить за дополнительными поведением.

Я очень часто использую count(/html/body) = 0, поскольку конкретное количество узлов более интересно, чем набор. Например... когда неожиданно более 1 node соответствует вашему выражению.

<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>

Ответ 5

Я работаю в Ruby и, используя Nokogiri, я извлекаю элемент и смотрю, есть ли результат nil.

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?

Ответ 6

Вариант при использовании xpath в Java с помощью count():

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