xpath найти, если узел существует - PullRequest
195 голосов
/ 20 апреля 2009

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

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

Ответы [ 6 ]

310 голосов
/ 20 апреля 2009
<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>
68 голосов
/ 20 сентября 2010

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

47 голосов
/ 04 июля 2011

Патрик прав, как в использовании 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>
13 голосов
/ 01 мая 2011

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

Я очень часто использую 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>
4 голосов
/ 17 февраля 2012

Я работаю в 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?
3 голосов
/ 25 апреля 2010

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

int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
    // body node missing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...