อะไรคือความแตกต่างระหว่าง“ / node ()” และ“ node ()” ใน XPath?

Aug 18 2020

ตามความเข้าใจของฉันเกี่ยวกับ XPath สำหรับเอกสาร HTML หรือ XML ใด ๆ :
$x("/node()")หมาย$x("/child::node()")ถึงส่งคืนโหนดซึ่งเป็นลูกของโหนดบริบท ที่นี่โหนดรูท(/)คือโหนดบริบท ดังนั้นจึงส่งคืนhtmlองค์ประกอบ

$x("node()")หมายถึง$x("child::node()")ซึ่งส่งคืนhtmlองค์ประกอบเดียวกันด้วย แต่ในกรณีนี้เราไม่ได้จัดเตรียมโหนดบริบทที่แตกต่างจากกรณีข้างต้น ดังนั้นจะระบุโหนดบริบทในกรณีนี้ได้อย่างไร?

นอกจากนี้ทั้งสองนิพจน์ XPath ข้างต้นมีวากยสัมพันธ์และใช้งานได้เหมือนกัน

คำตอบ

1 kjhughes Aug 18 2020 at 22:16

ความแตกต่างคือ/node()ระบุโหนดบริบทอย่างแน่นอนเป็นเอกสาร root ( /) แต่node()อาศัยโหนดบริบทสัมพัทธ์โดยนัย

โหนดบริบทสัมพันธ์โดยนัยถูกกำหนดอย่างไร ขึ้นอยู่กับบริบท ;-) ตัวอย่างเช่นภาษาโฮสติ้งมักจะตั้งค่าโหนดบริบทเริ่มต้นเป็นโหนดปัจจุบันที่จับคู่หรือทำซ้ำ จากนั้นภายในการประเมิน XPath เองแต่ละขั้นตอนตำแหน่ง (คั่นด้วยเครื่องหมายทับ/) จะสร้างโหนดบริบทสำหรับขั้นตอนต่อไป

$x(path, [startNode])สัญกรณ์ใช้ใน Chrome คอนโซลใช้เวลาอาร์กิวเมนต์ที่สองตัวเลือกที่สามารถนำมาใช้เพื่อระบุโหนดบริบทอย่างชัดเจน โดยค่าเริ่มต้นจะเท่ากับโหนดรากของเอกสารซึ่งนำไปสู่พฤติกรรมที่สังเกตได้โดยที่$x("node()")และ$x("/node()")ส่งคืนผลลัพธ์เดียวกันสำหรับเอกสารที่กำหนด

นอกจากนี้ทั้งสองนิพจน์ XPath ข้างต้นมีวากยสัมพันธ์และใช้งานได้เหมือนกัน

เห็นได้ชัดnode()และchild::node()มีความแตกต่างกันทางวากยสัมพันธ์แต่ใช่มันมีความหมาย (หรือใช้งานได้ตามที่คุณพูด) เหมือนกันเนื่องจากchild::แกนเป็นแกนเริ่มต้น

ดูสิ่งนี้ด้วย

  • โหนดปัจจุบันเทียบกับโหนดบริบทใน XSLT / XPath?
  • อะไรคือความแตกต่างระหว่างโหนดรูทองค์ประกอบรูทและองค์ประกอบเอกสารใน XML
  • อะไรคือความแตกต่างระหว่าง. // และ // * ใน XPath?