#![forbid(unsafe_code)]
pub mod ast;
pub mod compiler;
pub mod error;
pub mod eval;
pub mod extensions;
pub mod format_number;
pub mod functions;
pub mod loader;
pub mod number;
pub mod output;
pub mod pattern;
pub mod result_tree;
pub mod schematron;
pub mod sort;
pub mod walk;
pub mod whitespace;
pub use loader::{FilesystemLoader, InMemoryLoader, Loader, NullLoader};
pub use ast::StylesheetAst;
pub use error::XsltError;
pub use extensions::{ExtensionFunctions, Extensions};
pub use sup_xml_core::xpath::XPathValue;
pub const XSLT_NS: &str = "http://www.w3.org/1999/XSL/Transform";
#[derive(Debug)]
pub struct Stylesheet {
pub ast: StylesheetAst,
}
impl Stylesheet {
pub fn compile(
stylesheet_doc: &sup_xml_tree::dom::Document,
) -> Result<Self, XsltError> {
let ast = compiler::compile(stylesheet_doc)?;
Ok(Stylesheet { ast })
}
pub fn compile_str(stylesheet_text: &str) -> Result<Self, XsltError> {
Self::compile_str_with_loader(stylesheet_text, &loader::NullLoader, None)
}
pub fn compile_str_with_loader(
stylesheet_text: &str,
loader: &dyn Loader,
base: Option<&str>,
) -> Result<Self, XsltError> {
let ast = compiler::compile_with_imports(
stylesheet_text, loader, base,
ast::StylesheetAst::default(),
&mut 0,
)?;
Self::finalize(ast)
}
pub fn compile_str_with_packages(
stylesheet_text: &str,
loader: &dyn Loader,
base: Option<&str>,
packages: std::collections::HashMap<String, (String, Option<String>)>,
) -> Result<Self, XsltError> {
let ast = compiler::compile_with_packages(stylesheet_text, loader, base, packages)?;
Self::finalize(ast)
}
fn finalize(mut ast: ast::StylesheetAst) -> Result<Self, XsltError> {
ast.includes.sort();
ast.includes.dedup();
ast.imports.sort();
ast.imports.dedup();
ast.documents_to_load.sort();
ast.documents_to_load.dedup();
compiler::validate_attribute_set_refs(&ast)?;
compiler::validate_named_template_uniqueness(&ast)?;
compiler::validate_output_declarations(&ast)?;
compiler::validate_call_template_with_params(&ast)?;
compiler::validate_iterate_constraints(&ast)?;
compiler::validate_input_type_annotations(&ast)?;
compiler::validate_package_exposes(&ast)?;
Ok(Stylesheet { ast })
}
pub fn apply(
&self,
source_doc: &sup_xml_tree::dom::Document,
) -> Result<ResultTree, XsltError> {
eval::apply_stylesheet(&self.ast, source_doc)
}
pub fn apply_with_loader(
&self,
source_doc: &sup_xml_tree::dom::Document,
loader: &dyn Loader,
base: Option<&str>,
) -> Result<ResultTree, XsltError> {
eval::apply_stylesheet_with_loader(&self.ast, source_doc, loader, base)
}
pub fn apply_with_extensions(
&self,
source_doc: &sup_xml_tree::dom::Document,
extensions: &dyn ExtensionFunctions,
) -> Result<ResultTree, XsltError> {
eval::apply_stylesheet_full(
&self.ast, source_doc,
&loader::NullLoader, None,
Some(extensions),
)
}
pub fn apply_with_loader_and_extensions(
&self,
source_doc: &sup_xml_tree::dom::Document,
loader: &dyn Loader,
base: Option<&str>,
extensions: &dyn ExtensionFunctions,
) -> Result<ResultTree, XsltError> {
eval::apply_stylesheet_full(
&self.ast, source_doc,
loader, base,
Some(extensions),
)
}
pub fn apply_with_params(
&self,
source_doc: &sup_xml_tree::dom::Document,
loader: &dyn Loader,
base: Option<&str>,
params: &[(String, String)],
) -> Result<ResultTree, XsltError> {
eval::apply_stylesheet_full_with_params(
&self.ast, source_doc,
loader, base, None, params,
)
}
pub fn apply_with_params_and_initial(
&self,
source_doc: &sup_xml_tree::dom::Document,
loader: &dyn Loader,
base: Option<&str>,
params: &[(String, String)],
initial_template: Option<&str>,
) -> Result<ResultTree, XsltError> {
eval::apply_stylesheet_full_with_params_and_initial(
&self.ast, source_doc,
loader, base, None, params, initial_template, None,
)
}
pub fn apply_with_params_initial_and_mode(
&self,
source_doc: &sup_xml_tree::dom::Document,
loader: &dyn Loader,
base: Option<&str>,
params: &[(String, String)],
initial_template: Option<&str>,
initial_mode: Option<&str>,
) -> Result<ResultTree, XsltError> {
eval::apply_stylesheet_full_with_params_and_initial(
&self.ast, source_doc,
loader, base, None, params, initial_template, initial_mode,
)
}
}
pub use result_tree::ResultTree;