อะไรคือความแตกต่างระหว่าง“ / node ()” และ“ node ()” ใน XPath?
ตามความเข้าใจของฉันเกี่ยวกับ XPath สำหรับเอกสาร HTML หรือ XML ใด ๆ :
$x("/node()")
หมาย$x("/child::node()")
ถึงส่งคืนโหนดซึ่งเป็นลูกของโหนดบริบท ที่นี่โหนดรูท(/)
คือโหนดบริบท ดังนั้นจึงส่งคืนhtml
องค์ประกอบ
$x("node()")
หมายถึง$x("child::node()")
ซึ่งส่งคืนhtml
องค์ประกอบเดียวกันด้วย แต่ในกรณีนี้เราไม่ได้จัดเตรียมโหนดบริบทที่แตกต่างจากกรณีข้างต้น ดังนั้นจะระบุโหนดบริบทในกรณีนี้ได้อย่างไร?
นอกจากนี้ทั้งสองนิพจน์ XPath ข้างต้นมีวากยสัมพันธ์และใช้งานได้เหมือนกัน
คำตอบ
ความแตกต่างคือ/node()
ระบุโหนดบริบทอย่างแน่นอนเป็นเอกสาร root ( /
) แต่node()
อาศัยโหนดบริบทสัมพัทธ์โดยนัย
โหนดบริบทสัมพันธ์โดยนัยถูกกำหนดอย่างไร ขึ้นอยู่กับบริบท ;-) ตัวอย่างเช่นภาษาโฮสติ้งมักจะตั้งค่าโหนดบริบทเริ่มต้นเป็นโหนดปัจจุบันที่จับคู่หรือทำซ้ำ จากนั้นภายในการประเมิน XPath เองแต่ละขั้นตอนตำแหน่ง (คั่นด้วยเครื่องหมายทับ/
) จะสร้างโหนดบริบทสำหรับขั้นตอนต่อไป
$x(path, [startNode])สัญกรณ์ใช้ใน Chrome คอนโซลใช้เวลาอาร์กิวเมนต์ที่สองตัวเลือกที่สามารถนำมาใช้เพื่อระบุโหนดบริบทอย่างชัดเจน โดยค่าเริ่มต้นจะเท่ากับโหนดรากของเอกสารซึ่งนำไปสู่พฤติกรรมที่สังเกตได้โดยที่$x("node()")
และ$x("/node()")
ส่งคืนผลลัพธ์เดียวกันสำหรับเอกสารที่กำหนด
นอกจากนี้ทั้งสองนิพจน์ XPath ข้างต้นมีวากยสัมพันธ์และใช้งานได้เหมือนกัน
เห็นได้ชัดnode()
และchild::node()
มีความแตกต่างกันทางวากยสัมพันธ์แต่ใช่มันมีความหมาย (หรือใช้งานได้ตามที่คุณพูด) เหมือนกันเนื่องจากchild::
แกนเป็นแกนเริ่มต้น
ดูสิ่งนี้ด้วย
- โหนดปัจจุบันเทียบกับโหนดบริบทใน XSLT / XPath?
- อะไรคือความแตกต่างระหว่างโหนดรูทองค์ประกอบรูทและองค์ประกอบเอกสารใน XML
- อะไรคือความแตกต่างระหว่าง. // และ // * ใน XPath?