ฉันต้องการเขียนคำตอบที่เป็นมาตรฐานสำหรับคำถามนี้เนื่องจากคำตอบด้านบนมีปัญหา
ปัญหาของเรา
CSSเลือก:
.foo
จะเลือกองค์ประกอบใด ๆ ที่มีชั้นfoo
คุณทำสิ่งนี้ใน XPath ได้อย่างไร?
แม้ว่า XPath จะมีประสิทธิภาพมากกว่า CSS แต่XPath ไม่มีตัวเลือกคลาส CSS ที่เทียบเท่ากับเนทีฟ อย่างไรก็ตามมีวิธีแก้ไข
วิธีทำที่ถูกต้อง
ตัวเลือกที่เทียบเท่าในXPathคือ:
//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]
ฟังก์ชันnormalize-spaceแถบช่องว่างที่นำหน้าและต่อท้าย (และยังแทนที่ลำดับของอักขระช่องว่างด้วยช่องว่างเดียว)
(ในความหมายทั่วไป) นี่ก็เทียบเท่ากับตัวเลือก CSS:
*[class~="foo"]
ซึ่งจะจับคู่องค์ประกอบใด ๆ ที่มีค่าแอตทริบิวต์คลาสเป็นรายการของค่าที่คั่นด้วยช่องว่างซึ่งค่าหนึ่งเท่ากับfooทุกประการ
สองวิธีที่ชัดเจน แต่ไม่ถูกต้องในการทำ
ตัวเลือก XPath:
//*[@class="foo"]
ใช้ไม่ได้! เนื่องจากจะไม่ตรงกับองค์ประกอบที่มีมากกว่าหนึ่งคลาสเป็นต้น
<div class="foo bar">
นอกจากนี้จะไม่ตรงกันหากมีช่องว่างเพิ่มเติมรอบชื่อคลาส:
<div class=" foo ">
ตัวเลือก XPath ที่ 'ปรับปรุงแล้ว
//*[contains(@class, "foo")]
ใช้ไม่ได้เหมือนกัน! เนื่องจากจับคู่องค์ประกอบกับคลาสfoobarอย่างไม่ถูกต้องเช่น
<div class="foobar">
เครดิตไปที่เพื่อนคนนี้ซึ่งเป็นวิธีการแก้ปัญหาที่เผยแพร่เร็วที่สุดสำหรับปัญหานี้ที่ฉันพบบนเว็บ:
http://dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes- ใน xpathxslt /