xpath ค้นหาว่ามีโหนดอยู่หรือไม่


201

การใช้เคียวรี xpath คุณจะค้นหาว่ามีโหนด (แท็ก) อยู่หรือไม่

ตัวอย่างเช่นหากฉันต้องการตรวจสอบให้แน่ใจว่าหน้าเว็บไซต์มีโครงสร้างพื้นฐานที่ถูกต้องเช่น / html / body และ / html / head / title


อาจจะดีกว่าถ้าใช้ XML Schema ด้วยการระบุองค์ประกอบที่จำเป็น? ดังนั้นตรวจสอบว่าเอกสารใช้หรือไม่
abatishchev

คำตอบ:


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

41
ประหลาดใจที่คะแนนสูงเช่นนี้เนื่องจากคำถามไม่ได้ระบุการใช้ XSLT เลย
tjmoore

มันยอดเยี่ยม แต่ถ้าฉันต้องการตรวจสอบว่ามันว่างเปล่าหรือเปล่า?
SearchForKnowledge

3
@SearchForKnowledge คุณอาจถามว่าเป็นคำถามใหม่ที่ SO แต่เป็นคำแนะนำอย่างรวดเร็ว: html/body and not(html/body/node())(เช่นเพียงทดสอบว่ามีอยู่และไม่มีโหนดย่อยหรือโหนดข้อความใด ๆ )
อาเบล

71

ลองใช้นิพจน์ต่อไปนี้: boolean(path-to-node)


3
นี่คือสิ่งที่ฉันต้องการเมื่อใช้ XPath ใน Python กับ lxml
เลนซามูเอลแมคลีนผู้อาวุโส

1
สิ่งนี้ทำงานได้ดีเมื่อสร้างเงื่อนไขของกฎและการกระทำของกฎภายใน InfoPath 2010
Merenzo

3
นี่เป็นคำตอบที่ถูกต้องในแง่ที่ว่านี่เป็นจริงของการค้นหา XPath ซึ่งแตกต่างจากคำตอบอื่น ๆ ส่วนใหญ่
พอลอีเธอร์ตัน

48

Patrick ถูกต้องทั้งในการใช้งานxsl:ifและในไวยากรณ์สำหรับตรวจสอบการมีอยู่ของโหนด อย่างไรก็ตามในขณะที่การตอบสนองแพทริคหมายถึงไม่มีเทียบเท่า XSL ถ้า-แล้วอื่น ๆ ดังนั้นหากคุณกำลังมองหาบางสิ่งบางอย่างมากขึ้นเช่นถ้า-แล้วอื่นคุณปกติดีกว่าการใช้และxsl:choose xsl:otherwiseดังนั้นไวยากรณ์ตัวอย่างของ Patrick จะใช้งานได้ แต่นี่เป็นทางเลือก:

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

+1 สำหรับการสังเกตif-then-elseยังสิ่งที่เกี่ยวกับif-else if-else? ในคำตอบของ davenpcj ฉันสามารถวางtest="somexpath"ในวันที่ 2 เมื่อทำมันได้if-else if-elseหรือไม่
AabinGunz

3
@Abhishek ใช่คุณสามารถใส่ xsl เพิ่มเติมได้เมื่อมีเงื่อนไขอื่นและมีใบแจ้งยอดหลายสาขา คิดว่ามันเป็นเหมือน SELECT มากกว่า if-then-else โดยมี xsl: มิฉะนั้นเป็นค่าเริ่มต้น:
davenpcj

มันยอดเยี่ยม แต่ถ้าฉันต้องการตรวจสอบว่ามันว่างเปล่าหรือเปล่า?
SearchForKnowledge

13

อาจดีกว่าที่จะใช้ตัวเลือกไม่ต้องพิมพ์ (หรืออาจพิมพ์ผิด) การแสดงออกของคุณมากกว่าหนึ่งครั้งและช่วยให้คุณสามารถติดตามพฤติกรรมที่แตกต่างกันเพิ่มเติม

ฉันใช้บ่อยมากcount(/html/body) = 0เนื่องจากจำนวนโหนดที่เฉพาะเจาะจงน่าสนใจกว่าชุด ตัวอย่างเช่น ... เมื่อมีมากกว่า 1 โหนดที่ตรงกับการแสดงออกของคุณโดยไม่คาดคิด

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

ตามที่ระบุไว้ในรหัสข้างต้น xsl เพิ่มเติม: เมื่อสามารถเพิ่มส่วนคำสั่งเพื่อเปลี่ยนลักษณะการทำงานและจัดการหลายเงื่อนไขในวิธีที่ต่างกัน
davenpcj

count(/html/body) = 0 อัจฉริยะ! : DI ใช้/html[count(/body)=0]/someNodeสำหรับการเลือกsomeNodeเมื่อ/body(หรืออะไรก็ตาม) ที่ขาดหายไป
Stefan Rogin

1
@clickstefan /html[count(/body)=0]จะไม่เลือกอะไรเลยไม่สามารถมีโหนดรูทสองโหนดใน XML บางทีคุณอาจจะมีความหมาย/html[count(body)=0]ซึ่งจะเป็นเช่นเดียวกับหรือ/html[not(body)] /html[not(exists(body))]
Abel

@Abel ใช่ / html [count (// body) = 0] หรือวิธีที่คุณพูดน่าละอาย แต่ใช่ฉันไม่ได้ให้ตัวอย่างที่เหมาะสม
Stefan Rogin

4

ฉันทำงานในทับทิมและใช้ 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

รูปแบบเมื่อใช้ xpath ใน Java โดยใช้ count ():

int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
    // body node missing
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.