xee_xslt_ast/
parse.rs

1use xee_xpath_compiler::context::Variables;
2use xot::Xot;
3
4use crate::ast_core as ast;
5use crate::error::ElementError as Error;
6use crate::instruction::SequenceConstructorParser;
7use crate::staticeval::static_evaluate;
8use crate::{content::Content, context::Context, element::XsltParser, names::Names, state::State};
9
10type Result<V> = std::result::Result<V, Error>;
11
12pub fn parse_transform(s: &str) -> Result<ast::Transform> {
13    let mut xot = Xot::new();
14    let names = Names::new(&mut xot);
15    let (node, span_info) = xot
16        .parse_with_span_info(s)
17        .map_err(|_e| Error::Unsupported)?;
18    let node = xot.document_element(node).unwrap();
19    let mut state = State::new(xot, span_info, names);
20
21    let mut xot = Xot::new();
22    static_evaluate(&mut state, node, Variables::new(), &mut xot)
23        .map_err(|_e| Error::Unsupported)?;
24    let parser = XsltParser::new(&state);
25    parser.parse_transform(node)
26}
27
28pub fn parse_sequence_constructor_item(s: &str) -> Result<ast::SequenceConstructorItem> {
29    let mut xot = Xot::new();
30    let names = Names::new(&mut xot);
31    let (node, span_info) = xot.parse_with_span_info(s).unwrap();
32    let state = State::new(xot, span_info, names);
33    let node = state.xot.document_element(node).unwrap();
34
35    if let Some(element) = state.xot.element(node) {
36        let context = Context::new(state.xot.prefixes(node));
37        let content = Content::new(node, &state, context);
38        content.parse_element(
39            element,
40            ast::SequenceConstructorItem::parse_sequence_constructor_item,
41        )
42    } else {
43        Err(Error::Internal)
44    }
45}