libxml_rs/xml/xpath/mod.rs
1//! XPath 1.0 implementation (§25, §85 Phase 5).
2//!
3//! Complete XPath 1.0 engine: location paths, axes, node tests, predicates,
4//! functions, variables, namespaces, node sets, boolean/number/string
5//! conversion, comparison semantics, NaN/infinity/negative zero, document
6//! order, context position/size, extension functions, compiled expressions.
7//!
8//! # Modules
9//!
10//! - `ast` — expression AST types (axes, node tests, steps, operators)
11//! - `lexer` — tokenizer
12//! - `parser` — recursive descent parser
13//! - `types` — XPath value types (node sets, numbers, strings, booleans)
14//! - `context` — evaluation context (variables, namespaces, functions)
15//! - `axes` — axis traversal
16//! - `functions` — core function library (25 XPath 1.0 functions)
17//! - `eval` — evaluation engine
18
19pub mod ast;
20pub mod axes;
21pub mod context;
22pub mod eval;
23pub mod functions;
24pub mod lexer;
25pub mod parser;
26pub mod types;
27
28use ast::{CompiledExpr, Expr};
29use context::XPathContext;
30use parser::parse_xpath;
31use types::XPathValue;
32
33/// Parse and compile an XPath expression string.
34///
35/// Returns `None` on parse error.
36pub fn compile(expr_str: &str) -> Option<CompiledExpr> {
37 match parse_xpath(expr_str) {
38 Ok(expr) => Some(CompiledExpr::new(expr_str.to_string(), expr)),
39 Err(_) => None,
40 }
41}
42
43/// Evaluate a compiled XPath expression.
44///
45/// Returns `None` on evaluation error.
46pub fn evaluate(compiled: &CompiledExpr, context: &mut XPathContext) -> Option<XPathValue> {
47 eval::eval(context, &compiled.expr).ok()
48}
49
50/// Parse and evaluate in one step.
51pub fn evaluate_str(expr_str: &str, context: &mut XPathContext) -> Option<XPathValue> {
52 compile(expr_str).and_then(|compiled| evaluate(&compiled, context))
53}