xpath düğüm varsa bul


202

Bir xpath sorgusu kullanarak bir düğümün (etiketin) var olup olmadığını nasıl bulabilirsiniz?

Örneğin, bir web sitesi sayfasının / html / body ve / html / head / title gibi doğru temel yapıya sahip olduğundan emin olmam gerekirse


Belki XML Şeması'nı zorunlu öğeler göstergesiyle kullanmak daha iyidir? Bu nedenle bir belgenin onu kullanıp kullanmadığını kontrol edin.
abatishchev

Yanıtlar:


322
<xsl:if test="xpath-expression">...</xsl:if>

Yani mesela

<xsl:if test="/html/body">body node exists</xsl:if>
<xsl:if test="not(/html/body)">body node missing</xsl:if>

42
Sorunun XSLT kullanımını hiç belirtmediği göz önüne alındığında, böyle yüksek bir puanla şaşırttı.
tjmoore

Bu harika ama ya boş ya da boş olup olmadığını kontrol etmek istersem?
SearchForKnowledge

3
@SearchForKnowledge, muhtemelen bunu SO'da yeni bir soru olarak, ancak hızlı bir rehber olarak sormalısınız: html/body and not(html/body/node())(yani, sadece var olup olmadığını test edin ve herhangi bir alt düğüm veya metin düğümü içermiyor).
Abel

71

Aşağıdaki ifadeyi deneyin: boolean(path-to-node)


3
LXML ile Python XPath kullanırken tam olarak ihtiyacım olan bu.
Iain Samuel McLean Elder

1
Bu, InfoPath 2010'da Kural Koşulları ve Kural Eylemleri oluştururken bir uygulama yaptı.
Merenzo

3
Bu, diğer yanıtların çoğunun aksine, aslında bir XPath sorgusu olması bakımından doğru cevaptır.
Paul Etherton

48

Patrick, xsl:ifbir düğümün varlığını kontrol etmek için hem sözdiziminde hem de sözdiziminde doğrudur . Bununla birlikte, Patrick'in yanıtı, if-then-else ile eşdeğer bir xsl eşdeğeri yoktur, bu nedenle eğer if-then-else gibi daha fazla bir şey arıyorsanız, normalde xsl:chooseve öğelerini kullanmanız daha iyi olur xsl:otherwise. Yani, Patrick'in örnek sözdizimi işe yarayacak, ancak bu bir alternatif:

<xsl:choose>
 <xsl:when test="/html/body">body node exists</xsl:when>
 <xsl:otherwise>body node missing</xsl:otherwise>
</xsl:choose>

+1 not etmek için if-then-else, ayrıca ne olacak if-else if-else? Davenpcj'in cevabında, test="somexpath"ne zaman yapılacağını 2'ye yerleştirebilir miyim if-else if-else?
AabinGunz

3
@Abhishek Evet, daha fazla xsl koyabilirsiniz: diğer koşullarla ve çok dallı bir ifadeyle. Bunu xsl: aksi takdirde varsayılan olarak bir if-then-else yerine SELECT gibi düşünün.
davenpcj

Bu harika ama ya boş ya da boş olup olmadığını kontrol etmek istersem?
SearchForKnowledge

13

Bir seçeneği kullanmak daha iyi olabilir, ifadelerinizi bir kereden fazla yazmanız (veya muhtemelen yanlış yazmanız) gerekmez ve ek farklı davranışları izlemenizi sağlar.

Çok count(/html/body) = 0sayıda kullanıyorum , çünkü belirli düğüm sayısı setten daha ilginç. Örneğin ... beklenmedik bir şekilde ifadenizle eşleşen 1'den fazla düğüm olduğunda.

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

Yukarıdaki kodda belirtildiği gibi, davranışı değiştirmek ve birden çok koşulu farklı şekillerde işlemek için daha fazla xsl: when cümlesi eklenebilir.
davenpcj

count(/html/body) = 0 deha! : DI ne zaman (ya da ne olursa olsun) eksik olanı /html[count(/body)=0]/someNodeseçmek için kullanınsomeNode/body
Stefan Rogin

1
@clickstefan, /html[count(/body)=0]hiçbir şey seçmez, XML'de iki kök düğüm olamaz. Belki demek istedin /html[count(body)=0], hangisi ile aynı olurdu /html[not(body)], ya da /html[not(exists(body))].
Abel

@Abel evet, / html [count (// body) = 0] ya da nasıl söyledin, utanç verici ama evet uygun bir örnek vermedim
Stefan Rogin

4

Ruby'de çalışıyorum ve Nokogiri kullanarak elemanı alıyorum ve sonucun sıfır olup olmadığını görmek için bakıyorum.

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

Count () kullanarak Java'da xpath kullanılırken kullanılan bir varyasyon:

int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
    // body node missing
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.