Sự khác biệt giữa “/ node ()” và “node ()” trong XPath là gì?

Aug 18 2020

Theo hiểu biết của tôi về XPath, đối với bất kỳ tài liệu HTML hoặc XML nào:
$x("/node()")$x("/child::node()")nghĩa là trả về nút là con của nút ngữ cảnh. Ở đây, nút gốc (/)là nút ngữ cảnh. Do đó, nó trả về htmlphần tử.

$x("node()")có nghĩa là $x("child::node()")cũng trả về cùng một htmlphần tử. Nhưng trong trường hợp này, chúng tôi đã không cung cấp nút ngữ cảnh không giống như trong trường hợp trên. Vì vậy, làm thế nào để nó xác định nút ngữ cảnh trong trường hợp này?

Ngoài ra, cả hai biểu thức XPath ở trên đều giống nhau về mặt cú pháp và chức năng.

Trả lời

1 kjhughes Aug 18 2020 at 22:16

Sự khác biệt là /node()chỉ định nút ngữ cảnh hoàn toàn là gốc tài liệu ( /), nhưng node()dựa trên một nút ngữ cảnh tương đối, ngụ ý.

Làm thế nào để xác định một nút ngữ cảnh tương đối, ngụ ý? Vâng, dựa trên ngữ cảnh. ;-) Ví dụ: ngôn ngữ lưu trữ thường sẽ đặt nút ngữ cảnh ban đầu thành nút hiện tại đang được khớp hoặc lặp lại. Sau đó, trong sự đánh giá của chính XPath, mỗi bước vị trí (được phân tách bằng dấu gạch chéo, /) sẽ thiết lập nút ngữ cảnh cho các bước tiếp theo.

Các $x(path, [startNode])ký hiệu sử dụng trong Chrome giao diện điều khiển có một đối số thứ hai tùy chọn có thể được sử dụng để xác định các nút bối cảnh một cách rõ ràng. Theo mặc định, nó bằng với nút gốc của tài liệu, dẫn đến hành vi được quan sát ở đó $x("node()")$x("/node()")trả về cùng kết quả cho một tài liệu nhất định.

Ngoài ra, cả hai biểu thức XPath ở trên đều giống nhau về mặt cú pháp và chức năng.

Rõ ràng node()child::node()cú pháp khác nhau, nhưng, vâng, họ là ngữ nghĩa (hay theo chức năng , như bạn nói) cùng vì child::trục là trục mặc định.

Xem thêm

  • Nút hiện tại so với nút ngữ cảnh trong XSLT / XPath?
  • Sự khác biệt giữa nút gốc, phần tử gốc và phần tử tài liệu trong XML là gì?
  • Sự khác biệt giữa .// và // * trong XPath là gì?