xpath find jika ada node

201

Menggunakan kueri xpath bagaimana Anda menemukan jika ada simpul (tag) sama sekali?

Sebagai contoh jika saya perlu memastikan halaman situs web memiliki struktur dasar yang benar seperti / html / tubuh dan / html / kepala / judul

EddyR
sumber
Mungkin lebih baik menggunakan Skema XML dengan indikasi elemen wajib? Jadi, periksa apakah suatu dokumen menggunakannya atau tidak.
abatishchev

Jawaban:

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

jadi misalnya

<xsl:if test="/html/body">body node exists</xsl:if>
<xsl:if test="not(/html/body)">body node missing</xsl:if>
Patrick McDonald
sumber
41
Terkejut dengan peringkat tinggi karena pertanyaan itu tidak menentukan penggunaan XSLT sama sekali.
tjmoore
Ini luar biasa tetapi bagaimana jika saya ingin memeriksa apakah ada ATAU kosong?
SearchForKnowledge
3
@SearchForKnowledge, Anda mungkin harus menanyakannya sebagai pertanyaan baru di SO, tetapi sebagai panduan cepat: html/body and not(html/body/node())(yaitu, coba saja jika ada dan tidak mengandung simpul anak, atau simpul teks).
Abel
71

Coba ungkapan berikut: boolean(path-to-node)

annesley
sumber
3
Inilah yang saya butuhkan saat menggunakan XPath di Python dengan lxml.
Iain Samuel McLean Penatua
1
Ini berhasil ketika membangun Kondisi Aturan dan Tindakan Aturan dalam InfoPath 2010.
Merenzo
3
Ini adalah jawaban yang benar dalam arti bahwa ini sebenarnya adalah permintaan XPath, tidak seperti sebagian besar jawaban lainnya.
Paul Etherton
48

Patrick benar, baik dalam penggunaan xsl:if, dan dalam sintaksis untuk memeriksa keberadaan suatu simpul. Namun, seperti yang Patrick nyatakan, tidak ada xsl yang setara dengan if-then-else, jadi jika Anda mencari sesuatu yang lebih seperti if-then-else, Anda biasanya lebih baik menggunakan xsl:choosedan xsl:otherwise. Jadi, contoh sintaks Patrick akan berfungsi, tetapi ini merupakan alternatif:

<xsl:choose>
 <xsl:when test="/html/body">body node exists</xsl:when>
 <xsl:otherwise>body node missing</xsl:otherwise>
</xsl:choose>
gkrogers
sumber
+1 untuk diperhatikan if-then-else, juga bagaimana if-else if-else? Dalam jawaban davenpcj, bisakah saya menempatkan test="somexpath"ke-2 kapan membuatnya if-else if-else?
AabinGunz
3
@ Aghishek Ya, Anda dapat menempatkan lebih banyak xsl: ketika dengan kondisi lain dan memiliki pernyataan multi-cabang. Anggap saja lebih seperti SELECT daripada if-then-else, dengan xsl: jika tidak sebagai default :.
davenpcj
Ini luar biasa tetapi bagaimana jika saya ingin memeriksa apakah ada ATAU kosong?
SearchForKnowledge
13

Mungkin lebih baik menggunakan pilihan, tidak perlu mengetik (atau mungkin salah ketik) ekspresi Anda lebih dari sekali, dan memungkinkan Anda untuk mengikuti perilaku lain yang berbeda.

Saya sangat sering menggunakan count(/html/body) = 0, karena jumlah node tertentu lebih menarik daripada yang ditetapkan. Misalnya ... ketika ada lebih dari 1 simpul yang cocok dengan ekspresi Anda.

<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>
davenpcj
sumber
Seperti ditunjukkan dalam kode di atas, lebih banyak xsl: ketika klausa dapat ditambahkan untuk mengubah perilaku dan menangani beberapa kondisi dengan cara yang berbeda.
davenpcj
count(/html/body) = 0 jenius! : AKU menggunakannya /html[count(/body)=0]/someNodeuntuk memilih someNodekapan /body(atau apa pun) hilang
Stefan Rogin
1
@clickstefan, /html[count(/body)=0]tidak akan pernah memilih apa pun, tidak boleh ada dua simpul root dalam XML. Mungkin maksud Anda /html[count(body)=0], yang akan sama dengan /html[not(body)], atau /html[not(exists(body))].
Abel
@ Bel ya, / html [hitung (// tubuh) = 0] atau bagaimana Anda berkata, memalukan tapi ya saya tidak memberikan contoh yang tepat
Stefan Rogin
4

Saya bekerja di Ruby dan menggunakan Nokogiri saya mengambil elemen dan melihat apakah hasilnya nihil.

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?
bcolfer
sumber
3

Variasi saat menggunakan xpath di Java menggunakan count ():

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