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.