Skip to main content

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 exports;
24pub mod functions;
25pub mod lexer;
26pub mod parser;
27pub mod parser_context;
28pub mod types;
29
30use ast::{CompiledExpr, Expr};
31use context::XPathContext;
32use parser::parse_xpath;
33use types::XPathValue;
34
35/// Parse and compile an XPath expression string.
36///
37/// Returns `None` on parse error.
38pub fn compile(expr_str: &str) -> Option<CompiledExpr> {
39    match parse_xpath(expr_str) {
40        Ok(expr) => Some(CompiledExpr::new(expr_str.to_string(), expr)),
41        Err(_) => None,
42    }
43}
44
45/// Evaluate a compiled XPath expression.
46///
47/// Returns `None` on evaluation error.
48pub fn evaluate(compiled: &CompiledExpr, context: &mut XPathContext) -> Option<XPathValue> {
49    eval::eval(context, &compiled.expr).ok()
50}
51
52/// Parse and evaluate in one step.
53pub fn evaluate_str(expr_str: &str, context: &mut XPathContext) -> Option<XPathValue> {
54    compile(expr_str).and_then(|compiled| evaluate(&compiled, context))
55}