@tradik/xslt-processor 1.0.3 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +290 -45
- package/bin/lib/options.js +114 -0
- package/bin/lib/paths.js +186 -0
- package/bin/lib/transform.js +115 -0
- package/bin/xslt.js +68 -162
- package/dist/xslt-processor.browser.js +2074 -159
- package/dist/xslt-processor.browser.js.map +4 -4
- package/dist/xslt-processor.browser.min.js +6 -2
- package/dist/xslt-processor.browser.min.js.map +4 -4
- package/dist/xslt-processor.cjs +2078 -158
- package/dist/xslt-processor.cjs.map +4 -4
- package/dist/xslt-processor.d.cts +299 -0
- package/dist/xslt-processor.d.ts +92 -4
- package/dist/xslt-processor.js +2073 -157
- package/dist/xslt-processor.js.map +4 -4
- package/package.json +26 -15
- package/src/XSLTProcessor.js +177 -8
- package/src/index.js +11 -5
- package/src/xpath/evaluator.js +48 -7
- package/src/xslt/elements.js +57 -0
- package/src/xslt/engine.js +471 -179
- package/src/xslt/formatNumber.js +220 -0
- package/src/xslt/functions.js +191 -0
- package/src/xslt/index.js +31 -0
- package/src/xslt/keys.js +141 -0
- package/src/xslt/literalResult.js +167 -0
- package/src/xslt/number.js +178 -0
- package/src/xslt/numberFormat.js +155 -0
- package/src/xslt/resultTree.js +74 -0
- package/src/xslt/serializer/baseWriter.js +283 -0
- package/src/xslt/serializer/constants.js +78 -0
- package/src/xslt/serializer/escape.js +98 -0
- package/src/xslt/serializer/htmlSerializer.js +141 -0
- package/src/xslt/serializer/indent.js +51 -0
- package/src/xslt/serializer/namespaces.js +68 -0
- package/src/xslt/serializer/rawText.js +41 -0
- package/src/xslt/serializer/settings.js +103 -0
- package/src/xslt/serializer/textSerializer.js +29 -0
- package/src/xslt/serializer/xmlSerializer.js +127 -0
- package/src/xslt/serializer.js +57 -0
- package/src/xslt/templatePriority.js +45 -0
- package/src/xslt/uri.js +68 -0
- package/src/xslt/whitespace.js +184 -0
- package/src/XSLTProcessor.test.js +0 -930
- package/src/xpath/evaluator.test.js +0 -1852
- package/src/xpath/tokenizer.test.js +0 -224
- package/src/xslt/engine.test.js +0 -3130
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.js", "../src/xpath/tokenizer.js", "../src/xpath/parser.js", "../src/xpath/evaluator.js", "../src/xslt/engine.js", "../src/XSLTProcessor.js", "../src/xpath/index.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * xslt-processor\n *\n * JavaScript implementation of XSLTProcessor for browser environments.\n *\n * This package provides a JavaScript implementation of the W3C XSLTProcessor API\n * that can be used as a drop-in replacement for the native browser implementation.\n *\n * Specifications implemented:\n * - XPath 1.0: http://www.w3.org/TR/1999/REC-xpath-19991116\n * - XSLT 1.0: http://www.w3.org/TR/1999/REC-xslt-19991116\n * - DOM Level 3: http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/\n *\n * @example\n * // ESM import\n * import { XSLTProcessor, installGlobal } from 'xslt-processor';\n *\n * // Install as global replacement\n * installGlobal();\n *\n * // Or use directly\n * const processor = new XSLTProcessor();\n * processor.importStylesheet(xsltDoc);\n * const result = processor.transformToFragment(xmlDoc, document);\n */\n\n// Main XSLTProcessor class\nexport {\n XSLTProcessor,\n isNativeXSLTSupported,\n installGlobal,\n default as default,\n} from \"./XSLTProcessor.js\";\n\n// XPath module (for advanced users)\nexport {\n evaluate as evaluateXPath,\n select as selectXPath,\n selectFirst as selectFirstXPath,\n XPathEvaluator,\n XPathContext,\n XPathResultType,\n parse as parseXPath,\n} from \"./xpath/index.js\";\n\n// XSLT engine (for advanced users)\nexport { XsltEngine, XsltContext } from \"./xslt/index.js\";\n\n/**\n * Version information\n */\nexport const VERSION = \"1.0.0\";\n\n/**\n * Check if we're running in a browser environment\n */\nexport const isBrowser =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n/**\n * Check if we're running in Node.js\n */\nexport const isNode =\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null;\n", "/**\n * XPath 1.0 Tokenizer\n * Based on W3C XPath 1.0 Specification: http://www.w3.org/TR/1999/REC-xpath-19991116\n *\n * Converts XPath expression strings into token streams for parsing.\n */\n\n\"use strict\";\n\nexport const TokenType = {\n // Literals\n NUMBER: \"NUMBER\",\n LITERAL: \"LITERAL\",\n\n // Operators\n SLASH: \"SLASH\",\n DOUBLE_SLASH: \"DOUBLE_SLASH\",\n PIPE: \"PIPE\",\n PLUS: \"PLUS\",\n MINUS: \"MINUS\",\n STAR: \"STAR\",\n DIV: \"DIV\",\n MOD: \"MOD\",\n EQUALS: \"EQUALS\",\n NOT_EQUALS: \"NOT_EQUALS\",\n LT: \"LT\",\n LTE: \"LTE\",\n GT: \"GT\",\n GTE: \"GTE\",\n AND: \"AND\",\n OR: \"OR\",\n\n // Brackets\n LPAREN: \"LPAREN\",\n RPAREN: \"RPAREN\",\n LBRACKET: \"LBRACKET\",\n RBRACKET: \"RBRACKET\",\n\n // Axes\n AXIS: \"AXIS\",\n AT: \"AT\",\n DOT: \"DOT\",\n DOUBLE_DOT: \"DOUBLE_DOT\",\n DOUBLE_COLON: \"DOUBLE_COLON\",\n\n // Names\n NAME: \"NAME\",\n NCNAME: \"NCNAME\",\n PREFIX: \"PREFIX\",\n FUNCTION: \"FUNCTION\",\n NODE_TYPE: \"NODE_TYPE\",\n\n // Other\n COMMA: \"COMMA\",\n DOLLAR: \"DOLLAR\",\n COLON: \"COLON\",\n EOF: \"EOF\",\n};\n\nconst AXIS_NAMES = new Set([\n \"ancestor\",\n \"ancestor-or-self\",\n \"attribute\",\n \"child\",\n \"descendant\",\n \"descendant-or-self\",\n \"following\",\n \"following-sibling\",\n \"namespace\",\n \"parent\",\n \"preceding\",\n \"preceding-sibling\",\n \"self\",\n]);\n\nconst NODE_TYPES = new Set([\n \"comment\",\n \"text\",\n \"processing-instruction\",\n \"node\",\n]);\n\nconst OPERATORS = new Set([\"and\", \"or\", \"mod\", \"div\"]);\n\nexport class Token {\n constructor(type, value, position) {\n this.type = type;\n this.value = value;\n this.position = position;\n }\n\n toString() {\n return `Token(${this.type}, ${JSON.stringify(this.value)}, pos=${this.position})`;\n }\n}\n\n// Tokens that indicate the NEXT token should NOT be treated as an OperatorName\n// Per XPath 1.0 spec: \"If there is a preceding token and the preceding token is not one of\n// @, ::, (, [, , or an Operator, then... an NCName must be recognized as an OperatorName.\"\n// So after these tokens, OperatorNames (div, mod, and, or) should be treated as regular names.\nconst OPERATOR_CONTEXT_BLOCKERS = new Set([\n TokenType.AT,\n TokenType.DOUBLE_COLON,\n TokenType.LPAREN,\n TokenType.LBRACKET,\n TokenType.COMMA,\n // Operators - after an operator, next name token should be a name, not an operator\n TokenType.SLASH,\n TokenType.DOUBLE_SLASH,\n TokenType.PIPE,\n TokenType.PLUS,\n TokenType.MINUS,\n TokenType.STAR,\n TokenType.DIV,\n TokenType.MOD,\n TokenType.EQUALS,\n TokenType.NOT_EQUALS,\n TokenType.LT,\n TokenType.LTE,\n TokenType.GT,\n TokenType.GTE,\n TokenType.AND,\n TokenType.OR,\n]);\n\nexport class XPathTokenizer {\n constructor(expression) {\n this.expression = expression;\n this.position = 0;\n this.tokens = [];\n }\n\n /**\n * Get the last token that was added (if any)\n */\n getLastToken() {\n return this.tokens.length > 0 ? this.tokens[this.tokens.length - 1] : null;\n }\n\n /**\n * Check if the current context allows operator names (div, mod, and, or)\n * Per XPath 1.0 spec disambiguation rules.\n */\n isOperatorContext() {\n const lastToken = this.getLastToken();\n // No preceding token means we're at the start - not an operator context\n if (!lastToken) return false;\n // If preceding token is a \"blocker\", it's not an operator context\n if (OPERATOR_CONTEXT_BLOCKERS.has(lastToken.type)) return false;\n // Otherwise, it IS an operator context (after names, numbers, closing brackets, etc.)\n return true;\n }\n\n tokenize() {\n this.tokens = [];\n this.position = 0;\n\n while (this.position < this.expression.length) {\n this.skipWhitespace();\n if (this.position >= this.expression.length) break;\n\n const token = this.nextToken();\n if (token) {\n this.tokens.push(token);\n }\n }\n\n this.tokens.push(new Token(TokenType.EOF, null, this.position));\n return this.tokens;\n }\n\n skipWhitespace() {\n while (\n this.position < this.expression.length &&\n /\\s/.test(this.expression[this.position])\n ) {\n this.position++;\n }\n }\n\n peek(offset = 0) {\n return this.expression[this.position + offset];\n }\n\n consume() {\n return this.expression[this.position++];\n }\n\n nextToken() {\n const startPos = this.position;\n const char = this.peek();\n\n // String literals\n if (char === '\"' || char === \"'\") {\n return this.readStringLiteral();\n }\n\n // Numbers\n if (/[0-9]/.test(char) || (char === \".\" && /[0-9]/.test(this.peek(1)))) {\n return this.readNumber();\n }\n\n // Multi-character operators\n if (char === \"/\" && this.peek(1) === \"/\") {\n this.position += 2;\n return new Token(TokenType.DOUBLE_SLASH, \"//\", startPos);\n }\n\n if (char === \".\" && this.peek(1) === \".\") {\n this.position += 2;\n return new Token(TokenType.DOUBLE_DOT, \"..\", startPos);\n }\n\n if (char === \":\" && this.peek(1) === \":\") {\n this.position += 2;\n return new Token(TokenType.DOUBLE_COLON, \"::\", startPos);\n }\n\n if (char === \"!\" && this.peek(1) === \"=\") {\n this.position += 2;\n return new Token(TokenType.NOT_EQUALS, \"!=\", startPos);\n }\n\n if (char === \"<\" && this.peek(1) === \"=\") {\n this.position += 2;\n return new Token(TokenType.LTE, \"<=\", startPos);\n }\n\n if (char === \">\" && this.peek(1) === \"=\") {\n this.position += 2;\n return new Token(TokenType.GTE, \">=\", startPos);\n }\n\n // Single-character tokens\n const singleCharTokens = {\n \"/\": TokenType.SLASH,\n \"|\": TokenType.PIPE,\n \"+\": TokenType.PLUS,\n \"-\": TokenType.MINUS,\n \"*\": TokenType.STAR,\n \"=\": TokenType.EQUALS,\n \"<\": TokenType.LT,\n \">\": TokenType.GT,\n \"(\": TokenType.LPAREN,\n \")\": TokenType.RPAREN,\n \"[\": TokenType.LBRACKET,\n \"]\": TokenType.RBRACKET,\n \"@\": TokenType.AT,\n \".\": TokenType.DOT,\n \",\": TokenType.COMMA,\n $: TokenType.DOLLAR,\n \":\": TokenType.COLON,\n };\n\n if (singleCharTokens[char]) {\n this.position++;\n return new Token(singleCharTokens[char], char, startPos);\n }\n\n // Names and keywords\n if (this.isNameStartChar(char)) {\n return this.readName();\n }\n\n throw new Error(\n `Unexpected character '${char}' at position ${this.position} in expression: ${this.expression}`,\n );\n }\n\n readStringLiteral() {\n const startPos = this.position;\n const quote = this.consume();\n let value = \"\";\n\n while (this.position < this.expression.length && this.peek() !== quote) {\n value += this.consume();\n }\n\n if (this.position >= this.expression.length) {\n throw new Error(`Unterminated string literal at position ${startPos}`);\n }\n\n this.consume(); // closing quote\n return new Token(TokenType.LITERAL, value, startPos);\n }\n\n readNumber() {\n const startPos = this.position;\n let value = \"\";\n\n // Integer part\n while (\n this.position < this.expression.length &&\n /[0-9]/.test(this.peek())\n ) {\n value += this.consume();\n }\n\n // Decimal part (handles both 1.5 and .5 style numbers)\n // For .5 style: entry condition ensures digit follows, so this branch handles it\n if (this.peek() === \".\" && /[0-9]/.test(this.peek(1))) {\n value += this.consume(); // .\n while (\n this.position < this.expression.length &&\n /[0-9]/.test(this.peek())\n ) {\n value += this.consume();\n }\n }\n\n return new Token(TokenType.NUMBER, parseFloat(value), startPos);\n }\n\n readName() {\n const startPos = this.position;\n let value = \"\";\n\n while (\n this.position < this.expression.length &&\n this.isNameChar(this.peek())\n ) {\n value += this.consume();\n }\n\n // Check for axis name followed by ::\n this.skipWhitespace();\n if (AXIS_NAMES.has(value) && this.peek() === \":\" && this.peek(1) === \":\") {\n return new Token(TokenType.AXIS, value, startPos);\n }\n\n // Check for function call (followed by '(')\n const savedPos = this.position;\n this.skipWhitespace();\n if (this.peek() === \"(\") {\n // Check if it's a node type test\n if (NODE_TYPES.has(value)) {\n return new Token(TokenType.NODE_TYPE, value, startPos);\n }\n return new Token(TokenType.FUNCTION, value, startPos);\n }\n this.position = savedPos;\n\n // Check for operators - only in operator context per XPath 1.0 disambiguation rules\n if (OPERATORS.has(value) && this.isOperatorContext()) {\n const opTokens = {\n and: TokenType.AND,\n or: TokenType.OR,\n mod: TokenType.MOD,\n div: TokenType.DIV,\n };\n return new Token(opTokens[value], value, startPos);\n }\n\n return new Token(TokenType.NAME, value, startPos);\n }\n\n isNameStartChar(char) {\n if (!char) return false;\n const code = char.charCodeAt(0);\n return (\n char === \"_\" ||\n (code >= 65 && code <= 90) || // A-Z\n (code >= 97 && code <= 122) || // a-z\n code >= 0xc0 // Unicode letters\n );\n }\n\n isNameChar(char) {\n if (!char) return false;\n const code = char.charCodeAt(0);\n return (\n this.isNameStartChar(char) ||\n char === \"-\" ||\n char === \".\" ||\n (code >= 48 && code <= 57) // 0-9\n );\n }\n}\n\nexport function tokenize(expression) {\n const tokenizer = new XPathTokenizer(expression);\n return tokenizer.tokenize();\n}\n", "/**\n * XPath 1.0 Parser\n * Based on W3C XPath 1.0 Specification: http://www.w3.org/TR/1999/REC-xpath-19991116\n *\n * Converts token stream into an Abstract Syntax Tree (AST).\n */\n\n\"use strict\";\n\nimport { TokenType, tokenize } from \"./tokenizer.js\";\n\nexport const NodeType = {\n // Expression types\n OR_EXPR: \"OrExpr\",\n AND_EXPR: \"AndExpr\",\n EQUALITY_EXPR: \"EqualityExpr\",\n RELATIONAL_EXPR: \"RelationalExpr\",\n ADDITIVE_EXPR: \"AdditiveExpr\",\n MULTIPLICATIVE_EXPR: \"MultiplicativeExpr\",\n UNARY_EXPR: \"UnaryExpr\",\n UNION_EXPR: \"UnionExpr\",\n\n // Path expressions\n PATH_EXPR: \"PathExpr\",\n LOCATION_PATH: \"LocationPath\",\n STEP: \"Step\",\n PREDICATE: \"Predicate\",\n\n // Primaries\n VARIABLE_REF: \"VariableRef\",\n LITERAL: \"Literal\",\n NUMBER: \"Number\",\n FUNCTION_CALL: \"FunctionCall\",\n\n // Node tests\n NAME_TEST: \"NameTest\",\n NODE_TYPE_TEST: \"NodeTypeTest\",\n PI_TEST: \"ProcessingInstructionTest\",\n};\n\nexport class ASTNode {\n constructor(type, props = {}) {\n this.type = type;\n Object.assign(this, props);\n }\n}\n\nexport class XPathParser {\n constructor(tokens) {\n this.tokens = tokens;\n this.position = 0;\n }\n\n parse() {\n const expr = this.parseExpr();\n if (!this.isAtEnd()) {\n throw new Error(\n `Unexpected token ${this.peek().type} at position ${this.peek().position}`,\n );\n }\n return expr;\n }\n\n // Expr ::= OrExpr\n parseExpr() {\n return this.parseOrExpr();\n }\n\n // OrExpr ::= AndExpr | OrExpr 'or' AndExpr\n parseOrExpr() {\n let left = this.parseAndExpr();\n\n while (this.match(TokenType.OR)) {\n const right = this.parseAndExpr();\n left = new ASTNode(NodeType.OR_EXPR, { left, right });\n }\n\n return left;\n }\n\n // AndExpr ::= EqualityExpr | AndExpr 'and' EqualityExpr\n parseAndExpr() {\n let left = this.parseEqualityExpr();\n\n while (this.match(TokenType.AND)) {\n const right = this.parseEqualityExpr();\n left = new ASTNode(NodeType.AND_EXPR, { left, right });\n }\n\n return left;\n }\n\n // EqualityExpr ::= RelationalExpr | EqualityExpr '=' RelationalExpr | EqualityExpr '!=' RelationalExpr\n parseEqualityExpr() {\n let left = this.parseRelationalExpr();\n\n while (true) {\n if (this.match(TokenType.EQUALS)) {\n const right = this.parseRelationalExpr();\n left = new ASTNode(NodeType.EQUALITY_EXPR, {\n operator: \"=\",\n left,\n right,\n });\n } else if (this.match(TokenType.NOT_EQUALS)) {\n const right = this.parseRelationalExpr();\n left = new ASTNode(NodeType.EQUALITY_EXPR, {\n operator: \"!=\",\n left,\n right,\n });\n } else {\n break;\n }\n }\n\n return left;\n }\n\n // RelationalExpr ::= AdditiveExpr | RelationalExpr '<' AdditiveExpr | ...\n parseRelationalExpr() {\n let left = this.parseAdditiveExpr();\n\n while (true) {\n if (this.match(TokenType.LT)) {\n const right = this.parseAdditiveExpr();\n left = new ASTNode(NodeType.RELATIONAL_EXPR, {\n operator: \"<\",\n left,\n right,\n });\n } else if (this.match(TokenType.LTE)) {\n const right = this.parseAdditiveExpr();\n left = new ASTNode(NodeType.RELATIONAL_EXPR, {\n operator: \"<=\",\n left,\n right,\n });\n } else if (this.match(TokenType.GT)) {\n const right = this.parseAdditiveExpr();\n left = new ASTNode(NodeType.RELATIONAL_EXPR, {\n operator: \">\",\n left,\n right,\n });\n } else if (this.match(TokenType.GTE)) {\n const right = this.parseAdditiveExpr();\n left = new ASTNode(NodeType.RELATIONAL_EXPR, {\n operator: \">=\",\n left,\n right,\n });\n } else {\n break;\n }\n }\n\n return left;\n }\n\n // AdditiveExpr ::= MultiplicativeExpr | AdditiveExpr '+' MultiplicativeExpr | AdditiveExpr '-' MultiplicativeExpr\n parseAdditiveExpr() {\n let left = this.parseMultiplicativeExpr();\n\n while (true) {\n if (this.match(TokenType.PLUS)) {\n const right = this.parseMultiplicativeExpr();\n left = new ASTNode(NodeType.ADDITIVE_EXPR, {\n operator: \"+\",\n left,\n right,\n });\n } else if (this.match(TokenType.MINUS)) {\n const right = this.parseMultiplicativeExpr();\n left = new ASTNode(NodeType.ADDITIVE_EXPR, {\n operator: \"-\",\n left,\n right,\n });\n } else {\n break;\n }\n }\n\n return left;\n }\n\n // MultiplicativeExpr ::= UnaryExpr | MultiplicativeExpr '*' UnaryExpr | ...\n parseMultiplicativeExpr() {\n let left = this.parseUnaryExpr();\n\n while (true) {\n if (this.match(TokenType.STAR)) {\n const right = this.parseUnaryExpr();\n left = new ASTNode(NodeType.MULTIPLICATIVE_EXPR, {\n operator: \"*\",\n left,\n right,\n });\n } else if (this.match(TokenType.DIV)) {\n const right = this.parseUnaryExpr();\n left = new ASTNode(NodeType.MULTIPLICATIVE_EXPR, {\n operator: \"div\",\n left,\n right,\n });\n } else if (this.match(TokenType.MOD)) {\n const right = this.parseUnaryExpr();\n left = new ASTNode(NodeType.MULTIPLICATIVE_EXPR, {\n operator: \"mod\",\n left,\n right,\n });\n } else {\n break;\n }\n }\n\n return left;\n }\n\n // UnaryExpr ::= UnionExpr | '-' UnaryExpr\n parseUnaryExpr() {\n if (this.match(TokenType.MINUS)) {\n const operand = this.parseUnaryExpr();\n return new ASTNode(NodeType.UNARY_EXPR, { operator: \"-\", operand });\n }\n return this.parseUnionExpr();\n }\n\n // UnionExpr ::= PathExpr | UnionExpr '|' PathExpr\n parseUnionExpr() {\n let left = this.parsePathExpr();\n\n while (this.match(TokenType.PIPE)) {\n const right = this.parsePathExpr();\n left = new ASTNode(NodeType.UNION_EXPR, { left, right });\n }\n\n return left;\n }\n\n // PathExpr ::= LocationPath | FilterExpr | FilterExpr '/' RelativeLocationPath | FilterExpr '//' RelativeLocationPath\n parsePathExpr() {\n // Check for absolute location path\n if (this.check(TokenType.SLASH) || this.check(TokenType.DOUBLE_SLASH)) {\n return this.parseLocationPath();\n }\n\n // Check if this looks like a location path starting with step\n if (this.isStepStart()) {\n return this.parseLocationPath();\n }\n\n // Otherwise try to parse as filter expression\n const filter = this.parseFilterExpr();\n\n // Check for path continuation\n if (this.check(TokenType.SLASH) || this.check(TokenType.DOUBLE_SLASH)) {\n const steps = [];\n\n while (\n this.check(TokenType.SLASH) ||\n this.check(TokenType.DOUBLE_SLASH)\n ) {\n const isDescendant = this.match(TokenType.DOUBLE_SLASH);\n if (!isDescendant) this.advance(); // consume /\n\n if (isDescendant) {\n steps.push(\n new ASTNode(NodeType.STEP, {\n axis: \"descendant-or-self\",\n nodeTest: new ASTNode(NodeType.NODE_TYPE_TEST, {\n nodeType: \"node\",\n }),\n predicates: [],\n }),\n );\n }\n\n steps.push(this.parseStep());\n }\n\n return new ASTNode(NodeType.PATH_EXPR, { filter, steps });\n }\n\n return filter;\n }\n\n // LocationPath ::= RelativeLocationPath | AbsoluteLocationPath\n parseLocationPath() {\n let absolute = false;\n const steps = [];\n\n if (this.match(TokenType.DOUBLE_SLASH)) {\n absolute = true;\n // //foo is equivalent to /descendant-or-self::node()/foo\n steps.push(\n new ASTNode(NodeType.STEP, {\n axis: \"descendant-or-self\",\n nodeTest: new ASTNode(NodeType.NODE_TYPE_TEST, { nodeType: \"node\" }),\n predicates: [],\n }),\n );\n if (!this.isAtEnd() && !this.check(TokenType.EOF)) {\n steps.push(this.parseStep());\n }\n } else if (this.match(TokenType.SLASH)) {\n absolute = true;\n if (this.isStepStart()) {\n steps.push(this.parseStep());\n }\n } else {\n steps.push(this.parseStep());\n }\n\n while (this.check(TokenType.SLASH) || this.check(TokenType.DOUBLE_SLASH)) {\n const isDescendant = this.match(TokenType.DOUBLE_SLASH);\n if (!isDescendant) this.advance(); // consume /\n\n if (isDescendant) {\n steps.push(\n new ASTNode(NodeType.STEP, {\n axis: \"descendant-or-self\",\n nodeTest: new ASTNode(NodeType.NODE_TYPE_TEST, {\n nodeType: \"node\",\n }),\n predicates: [],\n }),\n );\n }\n\n steps.push(this.parseStep());\n }\n\n return new ASTNode(NodeType.LOCATION_PATH, { absolute, steps });\n }\n\n // Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep\n parseStep() {\n // Handle abbreviated steps\n if (this.match(TokenType.DOT)) {\n return new ASTNode(NodeType.STEP, {\n axis: \"self\",\n nodeTest: new ASTNode(NodeType.NODE_TYPE_TEST, { nodeType: \"node\" }),\n predicates: [],\n });\n }\n\n if (this.match(TokenType.DOUBLE_DOT)) {\n return new ASTNode(NodeType.STEP, {\n axis: \"parent\",\n nodeTest: new ASTNode(NodeType.NODE_TYPE_TEST, { nodeType: \"node\" }),\n predicates: [],\n });\n }\n\n // Parse axis\n let axis = \"child\"; // default axis\n\n if (this.match(TokenType.AT)) {\n axis = \"attribute\";\n } else if (this.check(TokenType.AXIS)) {\n axis = this.advance().value;\n this.expect(TokenType.DOUBLE_COLON);\n }\n\n // Parse node test\n const nodeTest = this.parseNodeTest();\n\n // Parse predicates\n const predicates = [];\n while (this.check(TokenType.LBRACKET)) {\n predicates.push(this.parsePredicate());\n }\n\n return new ASTNode(NodeType.STEP, { axis, nodeTest, predicates });\n }\n\n // NodeTest ::= NameTest | NodeType '(' ')' | 'processing-instruction' '(' Literal ')'\n parseNodeTest() {\n if (this.check(TokenType.NODE_TYPE)) {\n const nodeType = this.advance().value;\n this.expect(TokenType.LPAREN);\n\n if (\n nodeType === \"processing-instruction\" &&\n this.check(TokenType.LITERAL)\n ) {\n const name = this.advance().value;\n this.expect(TokenType.RPAREN);\n return new ASTNode(NodeType.PI_TEST, { name });\n }\n\n this.expect(TokenType.RPAREN);\n return new ASTNode(NodeType.NODE_TYPE_TEST, { nodeType });\n }\n\n // NameTest\n return this.parseNameTest();\n }\n\n // NameTest ::= '*' | NCName ':' '*' | QName\n parseNameTest() {\n if (this.match(TokenType.STAR)) {\n return new ASTNode(NodeType.NAME_TEST, { name: \"*\", prefix: null });\n }\n\n if (!this.check(TokenType.NAME)) {\n throw new Error(`Expected name at position ${this.peek().position}`);\n }\n\n const name = this.advance().value;\n\n // Check for prefix:*\n if (this.match(TokenType.COLON)) {\n if (this.match(TokenType.STAR)) {\n return new ASTNode(NodeType.NAME_TEST, { name: \"*\", prefix: name });\n }\n\n if (this.check(TokenType.NAME)) {\n const localName = this.advance().value;\n return new ASTNode(NodeType.NAME_TEST, {\n name: localName,\n prefix: name,\n });\n }\n\n throw new Error(\n `Expected name or * after : at position ${this.peek().position}`,\n );\n }\n\n return new ASTNode(NodeType.NAME_TEST, { name, prefix: null });\n }\n\n // Predicate ::= '[' Expr ']'\n parsePredicate() {\n this.expect(TokenType.LBRACKET);\n const expr = this.parseExpr();\n this.expect(TokenType.RBRACKET);\n return new ASTNode(NodeType.PREDICATE, { expr });\n }\n\n // FilterExpr ::= PrimaryExpr | FilterExpr Predicate\n parseFilterExpr() {\n let primary = this.parsePrimaryExpr();\n\n while (this.check(TokenType.LBRACKET)) {\n const predicate = this.parsePredicate();\n primary = new ASTNode(NodeType.PATH_EXPR, {\n filter: primary,\n predicates: [predicate],\n });\n }\n\n return primary;\n }\n\n // PrimaryExpr ::= VariableReference | '(' Expr ')' | Literal | Number | FunctionCall\n parsePrimaryExpr() {\n // Variable reference\n if (this.match(TokenType.DOLLAR)) {\n if (!this.check(TokenType.NAME)) {\n throw new Error(\n `Expected variable name at position ${this.peek().position}`,\n );\n }\n const name = this.advance().value;\n let prefix = null;\n\n if (this.match(TokenType.COLON)) {\n prefix = name;\n if (!this.check(TokenType.NAME)) {\n throw new Error(\n `Expected local name at position ${this.peek().position}`,\n );\n }\n const localName = this.advance().value;\n return new ASTNode(NodeType.VARIABLE_REF, { name: localName, prefix });\n }\n\n return new ASTNode(NodeType.VARIABLE_REF, { name, prefix });\n }\n\n // Parenthesized expression\n if (this.match(TokenType.LPAREN)) {\n const expr = this.parseExpr();\n this.expect(TokenType.RPAREN);\n return expr;\n }\n\n // Literal\n if (this.check(TokenType.LITERAL)) {\n return new ASTNode(NodeType.LITERAL, { value: this.advance().value });\n }\n\n // Number\n if (this.check(TokenType.NUMBER)) {\n return new ASTNode(NodeType.NUMBER, { value: this.advance().value });\n }\n\n // Function call\n if (this.check(TokenType.FUNCTION)) {\n return this.parseFunctionCall();\n }\n\n throw new Error(\n `Unexpected token ${this.peek().type} at position ${this.peek().position}`,\n );\n }\n\n // FunctionCall ::= FunctionName '(' ( Argument ( ',' Argument )* )? ')'\n // Note: Prefixed function calls (prefix:fn()) are not supported because\n // the tokenizer identifies functions by NAME followed by '(' - prefixed\n // names like 'fn:name()' are tokenized as NAME:NAME() which is parsed\n // as a location path, not a function call.\n parseFunctionCall() {\n const name = this.advance().value;\n return this.parseFunctionCallArgs(name, null);\n }\n\n parseFunctionCallArgs(name, prefix) {\n this.expect(TokenType.LPAREN);\n\n const args = [];\n if (!this.check(TokenType.RPAREN)) {\n args.push(this.parseExpr());\n while (this.match(TokenType.COMMA)) {\n args.push(this.parseExpr());\n }\n }\n\n this.expect(TokenType.RPAREN);\n\n return new ASTNode(NodeType.FUNCTION_CALL, { name, prefix, args });\n }\n\n // Helper methods\n isStepStart() {\n const type = this.peek().type;\n return (\n type === TokenType.NAME ||\n type === TokenType.STAR ||\n type === TokenType.AT ||\n type === TokenType.DOT ||\n type === TokenType.DOUBLE_DOT ||\n type === TokenType.AXIS ||\n type === TokenType.NODE_TYPE\n );\n }\n\n peek() {\n return this.tokens[this.position];\n }\n\n advance() {\n if (!this.isAtEnd()) {\n return this.tokens[this.position++];\n }\n return this.tokens[this.position];\n }\n\n check(type) {\n if (this.isAtEnd()) return false;\n return this.peek().type === type;\n }\n\n match(type) {\n if (this.check(type)) {\n this.advance();\n return true;\n }\n return false;\n }\n\n expect(type) {\n if (!this.check(type)) {\n throw new Error(\n `Expected ${type} but got ${this.peek().type} at position ${this.peek().position}`,\n );\n }\n return this.advance();\n }\n\n isAtEnd() {\n return this.peek().type === TokenType.EOF;\n }\n}\n\nexport function parse(expression) {\n const tokens = tokenize(expression);\n const parser = new XPathParser(tokens);\n return parser.parse();\n}\n", "/**\n * XPath 1.0 Evaluator\n * Based on W3C XPath 1.0 Specification: http://www.w3.org/TR/1999/REC-xpath-19991116\n *\n * Evaluates XPath AST against DOM nodes.\n */\n\n\"use strict\";\n\nimport { NodeType } from \"./parser.js\";\n\n/**\n * XPath result types matching W3C spec\n */\nexport const XPathResultType = {\n ANY_TYPE: 0,\n NUMBER_TYPE: 1,\n STRING_TYPE: 2,\n BOOLEAN_TYPE: 3,\n UNORDERED_NODE_ITERATOR_TYPE: 4,\n ORDERED_NODE_ITERATOR_TYPE: 5,\n UNORDERED_NODE_SNAPSHOT_TYPE: 6,\n ORDERED_NODE_SNAPSHOT_TYPE: 7,\n ANY_UNORDERED_NODE_TYPE: 8,\n FIRST_ORDERED_NODE_TYPE: 9,\n};\n\n/**\n * Security limits to prevent DoS attacks\n */\nexport const XPathLimits = {\n MAX_RECURSION_DEPTH: 100,\n MAX_RESULT_SIZE: 10000,\n MAX_STRING_LENGTH: 1000000,\n};\n\n/**\n * Forbidden variable names to prevent prototype pollution\n */\nconst FORBIDDEN_VARIABLE_NAMES = Object.freeze([\n \"__proto__\",\n \"constructor\",\n \"prototype\",\n \"__defineGetter__\",\n \"__defineSetter__\",\n \"__lookupGetter__\",\n \"__lookupSetter__\",\n]);\n\n/**\n * XPath evaluation context\n */\nexport class XPathContext {\n constructor(node, position = 1, size = 1, variables = {}, namespaces = {}) {\n this.node = node;\n this.position = position;\n this.size = size;\n this.variables = variables;\n this.namespaces = namespaces;\n }\n\n clone(overrides = {}) {\n return new XPathContext(\n overrides.node ?? this.node,\n overrides.position ?? this.position,\n overrides.size ?? this.size,\n overrides.variables ?? this.variables,\n overrides.namespaces ?? this.namespaces,\n );\n }\n}\n\n/**\n * XPath Evaluator\n */\nexport class XPathEvaluator {\n constructor(options = {}) {\n this.functions = this.initCoreFunctions();\n this.maxRecursionDepth =\n options.maxRecursionDepth ?? XPathLimits.MAX_RECURSION_DEPTH;\n this.maxResultSize = options.maxResultSize ?? XPathLimits.MAX_RESULT_SIZE;\n this.maxStringLength =\n options.maxStringLength ?? XPathLimits.MAX_STRING_LENGTH;\n this.recursionDepth = 0;\n }\n\n /**\n * Evaluate XPath expression against a context\n * @throws {Error} If recursion depth exceeds limit\n * @throws {Error} If AST is invalid\n */\n evaluate(ast, context) {\n if (!ast || typeof ast !== \"object\") {\n throw new Error(\"Invalid AST: expected object\");\n }\n\n if (!ast.type) {\n throw new Error(\"Invalid AST: missing type property\");\n }\n\n this.recursionDepth++;\n if (this.recursionDepth > this.maxRecursionDepth) {\n this.recursionDepth = 0;\n throw new Error(\n `Maximum recursion depth exceeded (${this.maxRecursionDepth})`,\n );\n }\n\n try {\n return this.evaluateInternal(ast, context);\n } finally {\n this.recursionDepth--;\n }\n }\n\n /**\n * Internal evaluation (after validation)\n */\n evaluateInternal(ast, context) {\n switch (ast.type) {\n case NodeType.OR_EXPR:\n return this.evalOrExpr(ast, context);\n case NodeType.AND_EXPR:\n return this.evalAndExpr(ast, context);\n case NodeType.EQUALITY_EXPR:\n return this.evalEqualityExpr(ast, context);\n case NodeType.RELATIONAL_EXPR:\n return this.evalRelationalExpr(ast, context);\n case NodeType.ADDITIVE_EXPR:\n return this.evalAdditiveExpr(ast, context);\n case NodeType.MULTIPLICATIVE_EXPR:\n return this.evalMultiplicativeExpr(ast, context);\n case NodeType.UNARY_EXPR:\n return this.evalUnaryExpr(ast, context);\n case NodeType.UNION_EXPR:\n return this.evalUnionExpr(ast, context);\n case NodeType.PATH_EXPR:\n return this.evalPathExpr(ast, context);\n case NodeType.LOCATION_PATH:\n return this.evalLocationPath(ast, context);\n case NodeType.VARIABLE_REF:\n return this.evalVariableRef(ast, context);\n case NodeType.LITERAL:\n return this.validateString(ast.value);\n case NodeType.NUMBER:\n return ast.value;\n case NodeType.FUNCTION_CALL:\n return this.evalFunctionCall(ast, context);\n default:\n throw new Error(`Unknown AST node type: ${String(ast.type)}`);\n }\n }\n\n /**\n * Validate and limit string length\n */\n validateString(str) {\n if (typeof str === \"string\" && str.length > this.maxStringLength) {\n throw new Error(\n `String exceeds maximum length (${this.maxStringLength})`,\n );\n }\n return str;\n }\n\n /**\n * Validate result size\n */\n validateResultSize(nodes) {\n if (Array.isArray(nodes) && nodes.length > this.maxResultSize) {\n throw new Error(\n `Result set exceeds maximum size (${this.maxResultSize})`,\n );\n }\n return nodes;\n }\n\n evalOrExpr(ast, context) {\n return (\n this.toBoolean(this.evaluate(ast.left, context)) ||\n this.toBoolean(this.evaluate(ast.right, context))\n );\n }\n\n evalAndExpr(ast, context) {\n return (\n this.toBoolean(this.evaluate(ast.left, context)) &&\n this.toBoolean(this.evaluate(ast.right, context))\n );\n }\n\n evalEqualityExpr(ast, context) {\n const left = this.evaluate(ast.left, context);\n const right = this.evaluate(ast.right, context);\n const isEqual = this.compareValues(left, right, \"=\");\n return ast.operator === \"=\" ? isEqual : !isEqual;\n }\n\n evalRelationalExpr(ast, context) {\n const left = this.evaluate(ast.left, context);\n const right = this.evaluate(ast.right, context);\n return this.compareValues(left, right, ast.operator);\n }\n\n evalAdditiveExpr(ast, context) {\n const left = this.toNumber(this.evaluate(ast.left, context));\n const right = this.toNumber(this.evaluate(ast.right, context));\n return ast.operator === \"+\" ? left + right : left - right;\n }\n\n evalMultiplicativeExpr(ast, context) {\n const left = this.toNumber(this.evaluate(ast.left, context));\n const right = this.toNumber(this.evaluate(ast.right, context));\n\n switch (ast.operator) {\n case \"*\":\n return left * right;\n case \"div\":\n return left / right;\n case \"mod\":\n return left % right;\n default:\n throw new Error(`Unknown multiplicative operator: ${ast.operator}`);\n }\n }\n\n evalUnaryExpr(ast, context) {\n const value = this.toNumber(this.evaluate(ast.operand, context));\n return -value;\n }\n\n evalUnionExpr(ast, context) {\n const left = this.evaluate(ast.left, context);\n const right = this.evaluate(ast.right, context);\n\n const leftNodes = Array.isArray(left) ? left : [left];\n const rightNodes = Array.isArray(right) ? right : [right];\n\n // Union in document order, no duplicates\n const seen = new Set();\n const result = [];\n\n for (const node of [...leftNodes, ...rightNodes]) {\n if (!seen.has(node)) {\n seen.add(node);\n result.push(node);\n }\n }\n\n this.validateResultSize(result);\n return this.sortByDocumentOrder(result);\n }\n\n evalPathExpr(ast, context) {\n if (ast.filter) {\n let result = this.evaluate(ast.filter, context);\n\n if (ast.predicates) {\n for (const pred of ast.predicates) {\n result = this.filterByPredicate(result, pred, context);\n }\n }\n\n if (ast.steps) {\n for (const step of ast.steps) {\n result = this.evalStepOnNodes(step, result, context);\n }\n }\n\n return result;\n }\n\n return [];\n }\n\n evalLocationPath(ast, context) {\n let nodes;\n\n if (ast.absolute) {\n // Start from document root node (not document element)\n // XPath absolute paths start from the document node\n const doc = context.node.ownerDocument || context.node;\n nodes = [doc];\n } else {\n nodes = [context.node];\n }\n\n for (const step of ast.steps) {\n nodes = this.evalStepOnNodes(step, nodes, context);\n this.validateResultSize(nodes);\n }\n\n return nodes;\n }\n\n evalStepOnNodes(step, nodes, context) {\n const allNodes = Array.isArray(nodes) ? nodes : [nodes];\n let result = [];\n\n for (const node of allNodes) {\n const stepNodes = this.evalStep(step, context.clone({ node }));\n result = result.concat(stepNodes);\n\n // Early validation to prevent excessive memory use\n if (result.length > this.maxResultSize * 2) {\n this.validateResultSize(result);\n }\n }\n\n // Remove duplicates and sort by document order\n const uniqueResult = [...new Set(result)];\n this.validateResultSize(uniqueResult);\n return this.sortByDocumentOrder(uniqueResult);\n }\n\n evalStep(step, context) {\n // Get nodes along axis\n let nodes = this.getAxisNodes(step.axis, context.node);\n\n // Filter by node test\n nodes = nodes.filter((n) => this.matchNodeTest(step.nodeTest, n, context));\n\n // Apply predicates\n for (const predicate of step.predicates) {\n nodes = this.filterByPredicate(nodes, predicate, context);\n }\n\n return nodes;\n }\n\n getAxisNodes(axis, node) {\n switch (axis) {\n case \"child\":\n return Array.from(node.childNodes || []);\n\n case \"parent\":\n return node.parentNode ? [node.parentNode] : [];\n\n case \"self\":\n return [node];\n\n case \"descendant\":\n return this.getDescendants(node, false);\n\n case \"descendant-or-self\":\n return this.getDescendants(node, true);\n\n case \"ancestor\":\n return this.getAncestors(node, false);\n\n case \"ancestor-or-self\":\n return this.getAncestors(node, true);\n\n case \"following-sibling\":\n return this.getFollowingSiblings(node);\n\n case \"preceding-sibling\":\n return this.getPrecedingSiblings(node);\n\n case \"following\":\n return this.getFollowing(node);\n\n case \"preceding\":\n return this.getPreceding(node);\n\n case \"attribute\":\n if (node.attributes) {\n return Array.from(node.attributes);\n }\n return [];\n\n case \"namespace\":\n // Namespace axis - not commonly used\n return [];\n\n default:\n throw new Error(`Unknown axis: ${axis}`);\n }\n }\n\n getDescendants(node, includeSelf) {\n const result = includeSelf ? [node] : [];\n const stack = Array.from(node.childNodes || []).reverse();\n\n while (stack.length > 0) {\n const current = stack.pop();\n result.push(current);\n if (current.childNodes) {\n for (let i = current.childNodes.length - 1; i >= 0; i--) {\n stack.push(current.childNodes[i]);\n }\n }\n }\n\n return result;\n }\n\n getAncestors(node, includeSelf) {\n const result = includeSelf ? [node] : [];\n let current = node.parentNode;\n\n while (current) {\n result.push(current);\n current = current.parentNode;\n }\n\n return result;\n }\n\n getFollowingSiblings(node) {\n const result = [];\n if (!node) return result;\n let current = node.nextSibling;\n\n while (current) {\n result.push(current);\n current = current.nextSibling;\n }\n\n return result;\n }\n\n getPrecedingSiblings(node) {\n const result = [];\n if (!node) return result;\n let current = node.previousSibling;\n\n while (current) {\n result.push(current);\n current = current.previousSibling;\n }\n\n return result.reverse();\n }\n\n getFollowing(node) {\n const result = [];\n let current = node;\n\n // Go to next sibling, or ancestor's next sibling\n while (current) {\n if (current.nextSibling) {\n current = current.nextSibling;\n result.push(current);\n // Add all descendants\n result.push(...this.getDescendants(current, false));\n } else {\n current = current.parentNode;\n }\n }\n\n return result;\n }\n\n getPreceding(node) {\n const result = [];\n let current = node;\n\n while (current) {\n if (current.previousSibling) {\n current = current.previousSibling;\n // Add descendants in reverse order, then the node\n const descendants = this.getDescendants(current, false);\n result.unshift(...descendants.reverse());\n result.unshift(current);\n } else {\n current = current.parentNode;\n if (current && current.nodeType !== 9) {\n // Not document\n // Don't add ancestors\n }\n }\n }\n\n return result;\n }\n\n matchNodeTest(nodeTest, node, context) {\n switch (nodeTest.type) {\n case NodeType.NAME_TEST:\n return this.matchNameTest(nodeTest, node, context);\n\n case NodeType.NODE_TYPE_TEST:\n return this.matchNodeTypeTest(nodeTest.nodeType, node);\n\n case NodeType.PI_TEST:\n return node.nodeType === 7 && node.nodeName === nodeTest.name;\n\n default:\n return false;\n }\n }\n\n matchNameTest(nodeTest, node, context) {\n // Only element and attribute nodes have names\n if (node.nodeType !== 1 && node.nodeType !== 2) {\n return false;\n }\n\n const name = nodeTest.name;\n const prefix = nodeTest.prefix;\n\n // Wildcard\n if (name === \"*\" && !prefix) {\n return true;\n }\n\n // Get node's local name and namespace\n const nodeName = node.localName || node.nodeName;\n const nodeNs = node.namespaceURI || null;\n\n // Prefix:* matches all nodes in namespace\n if (name === \"*\" && prefix) {\n const ns = context.namespaces[prefix];\n return nodeNs === ns;\n }\n\n // Simple name match\n if (!prefix) {\n // For elements, match local name (case-insensitive for HTML)\n const doc = node.ownerDocument;\n if (doc && doc.contentType === \"text/html\" && node.nodeType === 1) {\n return nodeName.toLowerCase() === name.toLowerCase();\n }\n return nodeName === name;\n }\n\n // Prefixed name match\n const ns = context.namespaces[prefix];\n return nodeName === name && nodeNs === ns;\n }\n\n matchNodeTypeTest(nodeType, node) {\n switch (nodeType) {\n case \"node\":\n return true;\n case \"text\":\n return node.nodeType === 3;\n case \"comment\":\n return node.nodeType === 8;\n case \"processing-instruction\":\n return node.nodeType === 7;\n default:\n return false;\n }\n }\n\n filterByPredicate(nodes, predicate, context) {\n const result = [];\n const nodeArray = Array.isArray(nodes) ? nodes : [nodes];\n const size = nodeArray.length;\n\n for (let i = 0; i < nodeArray.length; i++) {\n const node = nodeArray[i];\n const predicateContext = context.clone({\n node,\n position: i + 1,\n size,\n });\n\n const value = this.evaluate(predicate.expr, predicateContext);\n\n // If predicate evaluates to a number, it's a position test\n if (typeof value === \"number\") {\n if (value === i + 1) {\n result.push(node);\n }\n } else if (this.toBoolean(value)) {\n result.push(node);\n }\n }\n\n return result;\n }\n\n evalVariableRef(ast, context) {\n const name = ast.prefix ? `${ast.prefix}:${ast.name}` : ast.name;\n\n // Security: Prevent prototype pollution\n if (\n FORBIDDEN_VARIABLE_NAMES.includes(name) ||\n FORBIDDEN_VARIABLE_NAMES.includes(ast.name)\n ) {\n throw new Error(`Forbidden variable name: $${name}`);\n }\n\n if (!Object.prototype.hasOwnProperty.call(context.variables, name)) {\n throw new Error(`Undefined variable: $${name}`);\n }\n return context.variables[name];\n }\n\n evalFunctionCall(ast, context) {\n const name = ast.prefix ? `${ast.prefix}:${ast.name}` : ast.name;\n const fn = this.functions[name];\n\n if (!fn) {\n throw new Error(`Unknown function: ${name}`);\n }\n\n return fn.call(this, ast.args, context);\n }\n\n // Type conversion functions\n toBoolean(value) {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0 && !isNaN(value);\n if (typeof value === \"string\") return value.length > 0;\n if (Array.isArray(value)) return value.length > 0;\n if (value && value.nodeType) return true;\n return Boolean(value);\n }\n\n toNumber(value) {\n if (typeof value === \"number\") return value;\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed === \"\") return NaN;\n const num = Number(trimmed);\n return num;\n }\n if (Array.isArray(value)) {\n return this.toNumber(this.toString(value));\n }\n if (value && value.nodeType) {\n return this.toNumber(this.getStringValue(value));\n }\n return NaN;\n }\n\n toString(value) {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") {\n if (isNaN(value)) return \"NaN\";\n if (value === Infinity) return \"Infinity\";\n if (value === -Infinity) return \"-Infinity\";\n if (value === 0) return \"0\";\n return String(value);\n }\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n if (Array.isArray(value)) {\n if (value.length === 0) return \"\";\n return this.getStringValue(value[0]);\n }\n if (value && value.nodeType) {\n return this.getStringValue(value);\n }\n return String(value);\n }\n\n getStringValue(node) {\n if (!node) return \"\";\n\n switch (node.nodeType) {\n case 1: // Element\n case 9: // Document\n case 11: {\n // Document Fragment\n let text = \"\";\n const walker = (n) => {\n if (n.nodeType === 3) {\n text += n.nodeValue || \"\";\n } else if (n.childNodes) {\n for (const child of n.childNodes) {\n walker(child);\n }\n }\n };\n walker(node);\n return text;\n }\n\n case 2: // Attribute\n case 3: // Text\n case 4: // CDATA\n case 7: // Processing Instruction\n case 8: // Comment\n return node.nodeValue || \"\";\n\n default:\n return \"\";\n }\n }\n\n // Comparison helper\n compareValues(left, right, operator) {\n const leftIsNodeSet = Array.isArray(left);\n const rightIsNodeSet = Array.isArray(right);\n\n // Node-set comparisons\n if (leftIsNodeSet && rightIsNodeSet) {\n for (const l of left) {\n for (const r of right) {\n if (\n this.comparePrimitive(\n this.getStringValue(l),\n this.getStringValue(r),\n operator,\n )\n ) {\n return true;\n }\n }\n }\n return false;\n }\n\n if (leftIsNodeSet) {\n for (const l of left) {\n if (this.comparePrimitive(this.getStringValue(l), right, operator)) {\n return true;\n }\n }\n return false;\n }\n\n if (rightIsNodeSet) {\n for (const r of right) {\n if (this.comparePrimitive(left, this.getStringValue(r), operator)) {\n return true;\n }\n }\n return false;\n }\n\n return this.comparePrimitive(left, right, operator);\n }\n\n comparePrimitive(left, right, operator) {\n // If comparing for equality with different types\n if (operator === \"=\" || operator === \"!=\") {\n // If one is boolean, convert both to boolean\n if (typeof left === \"boolean\" || typeof right === \"boolean\") {\n const result = this.toBoolean(left) === this.toBoolean(right);\n return operator === \"=\" ? result : !result;\n }\n // If one is number, convert both to number\n if (typeof left === \"number\" || typeof right === \"number\") {\n const result = this.toNumber(left) === this.toNumber(right);\n return operator === \"=\" ? result : !result;\n }\n // Otherwise compare as strings\n const result = this.toString(left) === this.toString(right);\n return operator === \"=\" ? result : !result;\n }\n\n // Relational operators always compare as numbers\n const leftNum = this.toNumber(left);\n const rightNum = this.toNumber(right);\n\n switch (operator) {\n case \"<\":\n return leftNum < rightNum;\n case \"<=\":\n return leftNum <= rightNum;\n case \">\":\n return leftNum > rightNum;\n case \">=\":\n return leftNum >= rightNum;\n default:\n throw new Error(`Unknown comparison operator: ${operator}`);\n }\n }\n\n sortByDocumentOrder(nodes) {\n if (nodes.length <= 1) return nodes;\n\n return nodes.sort((a, b) => {\n if (a === b) return 0;\n\n const position = a.compareDocumentPosition\n ? a.compareDocumentPosition(b)\n : this.compareDocumentPositionFallback(a, b);\n\n if (position & 4) return -1; // a before b\n if (position & 2) return 1; // a after b\n return 0;\n });\n }\n\n compareDocumentPositionFallback(a, b) {\n // Simple fallback for environments without compareDocumentPosition\n const getPath = (node) => {\n const path = [];\n let current = node;\n while (current) {\n if (current.parentNode) {\n const siblings = Array.from(current.parentNode.childNodes);\n path.unshift(siblings.indexOf(current));\n }\n current = current.parentNode;\n }\n return path;\n };\n\n const pathA = getPath(a);\n const pathB = getPath(b);\n\n for (let i = 0; i < Math.min(pathA.length, pathB.length); i++) {\n if (pathA[i] < pathB[i]) return 4; // a before b\n if (pathA[i] > pathB[i]) return 2; // a after b\n }\n\n return pathA.length < pathB.length ? 4 : 2;\n }\n\n /**\n * Initialize XPath 1.0 core functions\n */\n initCoreFunctions() {\n return {\n // Node set functions\n last: (args, ctx) => ctx.size,\n position: (args, ctx) => ctx.position,\n count: (args, ctx) => {\n const nodeSet = this.evaluate(args[0], ctx);\n return Array.isArray(nodeSet) ? nodeSet.length : 1;\n },\n id: (args, ctx) => {\n const value = this.toString(this.evaluate(args[0], ctx));\n const doc = ctx.node.ownerDocument || ctx.node;\n const ids = value.split(/\\s+/).filter((id) => id);\n const result = [];\n for (const id of ids) {\n const el = doc.getElementById(id);\n if (el) result.push(el);\n }\n return result;\n },\n \"local-name\": (args, ctx) => {\n let node;\n if (args.length === 0) {\n node = ctx.node;\n } else {\n const nodeSet = this.evaluate(args[0], ctx);\n node = Array.isArray(nodeSet) ? nodeSet[0] : nodeSet;\n }\n if (!node) return \"\";\n return node.localName || node.nodeName || \"\";\n },\n \"namespace-uri\": (args, ctx) => {\n let node;\n if (args.length === 0) {\n node = ctx.node;\n } else {\n const nodeSet = this.evaluate(args[0], ctx);\n node = Array.isArray(nodeSet) ? nodeSet[0] : nodeSet;\n }\n if (!node) return \"\";\n return node.namespaceURI || \"\";\n },\n name: (args, ctx) => {\n let node;\n if (args.length === 0) {\n node = ctx.node;\n } else {\n const nodeSet = this.evaluate(args[0], ctx);\n node = Array.isArray(nodeSet) ? nodeSet[0] : nodeSet;\n }\n if (!node) return \"\";\n return node.nodeName || \"\";\n },\n\n // String functions\n string: (args, ctx) => {\n if (args.length === 0) {\n return this.toString([ctx.node]);\n }\n return this.toString(this.evaluate(args[0], ctx));\n },\n concat: (args, ctx) => {\n return args\n .map((arg) => this.toString(this.evaluate(arg, ctx)))\n .join(\"\");\n },\n \"starts-with\": (args, ctx) => {\n const str = this.toString(this.evaluate(args[0], ctx));\n const prefix = this.toString(this.evaluate(args[1], ctx));\n return str.startsWith(prefix);\n },\n contains: (args, ctx) => {\n const str = this.toString(this.evaluate(args[0], ctx));\n const substr = this.toString(this.evaluate(args[1], ctx));\n return str.includes(substr);\n },\n \"substring-before\": (args, ctx) => {\n const str = this.toString(this.evaluate(args[0], ctx));\n const substr = this.toString(this.evaluate(args[1], ctx));\n const idx = str.indexOf(substr);\n return idx === -1 ? \"\" : str.substring(0, idx);\n },\n \"substring-after\": (args, ctx) => {\n const str = this.toString(this.evaluate(args[0], ctx));\n const substr = this.toString(this.evaluate(args[1], ctx));\n const idx = str.indexOf(substr);\n return idx === -1 ? \"\" : str.substring(idx + substr.length);\n },\n substring: (args, ctx) => {\n const str = this.toString(this.evaluate(args[0], ctx));\n let start = Math.round(this.toNumber(this.evaluate(args[1], ctx)));\n let length;\n\n if (args.length > 2) {\n length = Math.round(this.toNumber(this.evaluate(args[2], ctx)));\n }\n\n // XPath uses 1-based indexing\n start = start - 1;\n\n if (isNaN(start)) return \"\";\n if (start < 0) {\n if (length !== undefined) {\n length = length + start;\n }\n start = 0;\n }\n\n if (length !== undefined) {\n if (isNaN(length) || length <= 0) return \"\";\n return str.substring(start, start + length);\n }\n\n return str.substring(start);\n },\n \"string-length\": (args, ctx) => {\n const str =\n args.length === 0\n ? this.toString([ctx.node])\n : this.toString(this.evaluate(args[0], ctx));\n return str.length;\n },\n \"normalize-space\": (args, ctx) => {\n const str =\n args.length === 0\n ? this.toString([ctx.node])\n : this.toString(this.evaluate(args[0], ctx));\n return str.trim().replace(/\\s+/g, \" \");\n },\n translate: (args, ctx) => {\n const str = this.toString(this.evaluate(args[0], ctx));\n const from = this.toString(this.evaluate(args[1], ctx));\n const to = this.toString(this.evaluate(args[2], ctx));\n\n let result = \"\";\n for (const char of str) {\n const idx = from.indexOf(char);\n if (idx === -1) {\n result += char;\n } else if (idx < to.length) {\n result += to[idx];\n }\n // If idx >= to.length, character is removed\n }\n return result;\n },\n\n // Boolean functions\n boolean: (args, ctx) => {\n return this.toBoolean(this.evaluate(args[0], ctx));\n },\n not: (args, ctx) => {\n return !this.toBoolean(this.evaluate(args[0], ctx));\n },\n true: () => true,\n false: () => false,\n lang: (args, ctx) => {\n const lang = this.toString(this.evaluate(args[0], ctx)).toLowerCase();\n let node = ctx.node;\n\n while (node && node.nodeType === 1) {\n const xmlLang =\n node.getAttribute(\"xml:lang\") || node.getAttribute(\"lang\");\n if (xmlLang) {\n const nodeLang = xmlLang.toLowerCase();\n return nodeLang === lang || nodeLang.startsWith(lang + \"-\");\n }\n node = node.parentNode;\n }\n return false;\n },\n\n // Number functions\n number: (args, ctx) => {\n if (args.length === 0) {\n return this.toNumber([ctx.node]);\n }\n return this.toNumber(this.evaluate(args[0], ctx));\n },\n sum: (args, ctx) => {\n const nodeSet = this.evaluate(args[0], ctx);\n if (!Array.isArray(nodeSet)) return NaN;\n return nodeSet.reduce(\n (sum, node) => sum + this.toNumber(this.getStringValue(node)),\n 0,\n );\n },\n floor: (args, ctx) => {\n return Math.floor(this.toNumber(this.evaluate(args[0], ctx)));\n },\n ceiling: (args, ctx) => {\n return Math.ceil(this.toNumber(this.evaluate(args[0], ctx)));\n },\n round: (args, ctx) => {\n const num = this.toNumber(this.evaluate(args[0], ctx));\n if (isNaN(num)) return NaN;\n if (num === -0.5) return -0;\n return Math.round(num);\n },\n };\n }\n}\n", "/**\n * XSLT 1.0 Processing Engine\n * Based on W3C XSLT 1.0 Specification: http://www.w3.org/TR/1999/REC-xslt-19991116\n *\n * Processes XSLT stylesheets and transforms XML documents.\n */\n\nimport { parse as parseXPath } from \"../xpath/parser.js\";\nimport { XPathEvaluator, XPathContext } from \"../xpath/evaluator.js\";\n\nconst XSLT_NS = \"http://www.w3.org/1999/XSL/Transform\";\n\n/**\n * XSLT Processing Context\n */\nexport class XsltContext {\n constructor(options = {}) {\n this.currentNode = options.currentNode;\n this.currentNodeList = options.currentNodeList || [];\n this.position = options.position || 1;\n this.variables = { ...options.variables };\n this.parameters = { ...options.parameters };\n this.outputDocument = options.outputDocument;\n this.stylesheet = options.stylesheet;\n this.namespaces = { ...options.namespaces };\n this.templates = options.templates || [];\n this.keys = options.keys || {};\n this.decimalFormats = options.decimalFormats || {};\n this.outputMethod = options.outputMethod || \"xml\";\n this.xpathEvaluator = options.xpathEvaluator || new XPathEvaluator();\n }\n\n clone(overrides = {}) {\n return new XsltContext({\n currentNode: overrides.currentNode ?? this.currentNode,\n currentNodeList: overrides.currentNodeList ?? this.currentNodeList,\n position: overrides.position ?? this.position,\n variables: overrides.variables\n ? { ...this.variables, ...overrides.variables }\n : { ...this.variables },\n parameters: overrides.parameters\n ? { ...this.parameters, ...overrides.parameters }\n : { ...this.parameters },\n outputDocument: this.outputDocument,\n stylesheet: this.stylesheet,\n namespaces: overrides.namespaces\n ? { ...this.namespaces, ...overrides.namespaces }\n : { ...this.namespaces },\n templates: this.templates,\n keys: this.keys,\n decimalFormats: this.decimalFormats,\n outputMethod: this.outputMethod,\n xpathEvaluator: this.xpathEvaluator,\n });\n }\n\n getVariable(name) {\n if (name in this.variables) {\n return this.variables[name];\n }\n if (name in this.parameters) {\n return this.parameters[name];\n }\n throw new Error(`Undefined variable: $${name}`);\n }\n\n setVariable(name, value) {\n this.variables[name] = value;\n }\n}\n\n/**\n * XSLT Engine\n */\nexport class XsltEngine {\n constructor(options = {}) {\n this.xpathEvaluator = new XPathEvaluator();\n this.templates = [];\n this.keys = {};\n this.globalVariables = {};\n this.globalParameters = {};\n this.outputSettings = {\n method: \"xml\",\n encoding: \"UTF-8\",\n indent: \"no\",\n omitXmlDeclaration: \"no\",\n doctypePublic: null,\n doctypeSystem: null,\n mediaType: null,\n cdataSectionElements: [],\n };\n this.namespaces = {};\n this.decimalFormats = {};\n this.stylesheetDoc = null;\n this.attributeSets = {};\n this.namespaceAliases = {};\n this.stripSpace = [];\n this.preserveSpace = [];\n\n // Import/Include support\n this.stylesheetLoader = options.stylesheetLoader || null;\n this.currentImportPrecedence = 0;\n this.processedStylesheets = new Set();\n this.baseUri = options.baseUri || \"\";\n }\n\n /**\n * Set the stylesheet loader function for xsl:import and xsl:include\n * @param {Function} loader - Function(href, baseUri) => Document or string (XML)\n */\n setStylesheetLoader(loader) {\n this.stylesheetLoader = loader;\n }\n\n /**\n * Resolve a relative URI against a base URI\n */\n resolveUri(href, baseUri) {\n if (\n !baseUri ||\n href.startsWith(\"http://\") ||\n href.startsWith(\"https://\") ||\n href.startsWith(\"/\")\n ) {\n return href;\n }\n\n // Remove filename from baseUri to get directory\n const lastSlash = baseUri.lastIndexOf(\"/\");\n const baseDir = lastSlash >= 0 ? baseUri.substring(0, lastSlash + 1) : \"\";\n\n return baseDir + href;\n }\n\n /**\n * Load an external stylesheet document\n */\n loadStylesheet(href, baseUri) {\n if (!this.stylesheetLoader) {\n throw new Error(\n `Cannot load stylesheet \"${href}\": no stylesheetLoader configured. ` +\n \"Use engine.setStylesheetLoader(fn) to provide a loader function.\",\n );\n }\n\n const resolvedUri = this.resolveUri(href, baseUri);\n const result = this.stylesheetLoader(resolvedUri, baseUri);\n\n // If result is a string, it needs to be parsed (caller should handle this)\n return { document: result, uri: resolvedUri };\n }\n\n /**\n * Parse XML string to document (helper for stylesheet loading)\n */\n parseXmlString(xmlString) {\n if (typeof DOMParser !== \"undefined\") {\n const parser = new DOMParser();\n const doc = parser.parseFromString(xmlString, \"application/xml\");\n const parseError = doc.querySelector(\"parsererror\");\n if (parseError) {\n throw new Error(`XML parse error: ${parseError.textContent}`);\n }\n return doc;\n }\n throw new Error(\"XML parsing not available in this environment\");\n }\n\n /**\n * Import and compile an XSLT stylesheet\n * @param {Document|Element} stylesheetNode - The stylesheet document or root element\n * @param {string} [stylesheetUri] - Optional URI of the stylesheet for resolving imports\n */\n importStylesheet(stylesheetNode, stylesheetUri) {\n const isMainStylesheet = this.stylesheetDoc === null;\n\n if (isMainStylesheet) {\n this.stylesheetDoc = stylesheetNode.ownerDocument || stylesheetNode;\n if (stylesheetUri) {\n this.baseUri = stylesheetUri;\n this.processedStylesheets.add(stylesheetUri);\n }\n }\n\n const root = stylesheetNode.documentElement || stylesheetNode;\n\n // Validate stylesheet\n if (\n !this.isXsltElement(root, \"stylesheet\") &&\n !this.isXsltElement(root, \"transform\")\n ) {\n // Check for literal result element (simplified stylesheet)\n if (root.getAttribute && root.getAttribute(\"xsl:version\")) {\n this.processLiteralResultStylesheet(root);\n return;\n }\n throw new Error(\n \"Invalid XSLT stylesheet: root element must be xsl:stylesheet or xsl:transform\",\n );\n }\n\n // Collect namespaces from root\n this.collectNamespaces(root);\n\n // XSLT 1.0: xsl:import elements MUST come first and are processed with lower precedence\n // Process imports first (they have lower precedence than the importing stylesheet)\n const imports = [];\n const otherElements = [];\n\n for (const child of root.childNodes) {\n if (child.nodeType !== 1) continue;\n\n if (this.isXsltElement(child, \"import\")) {\n imports.push(child);\n } else {\n otherElements.push(child);\n }\n }\n\n // Process imports (lower precedence - process before current stylesheet)\n for (const importNode of imports) {\n this.processImport(importNode, stylesheetUri || this.baseUri);\n }\n\n // Process other top-level elements (including includes)\n for (const child of otherElements) {\n if (this.isXsltElement(child, \"template\")) {\n this.registerTemplate(child);\n } else if (this.isXsltElement(child, \"output\")) {\n this.processOutput(child);\n } else if (this.isXsltElement(child, \"variable\")) {\n this.processGlobalVariable(child);\n } else if (this.isXsltElement(child, \"param\")) {\n this.processGlobalParam(child);\n } else if (this.isXsltElement(child, \"key\")) {\n this.processKey(child);\n } else if (this.isXsltElement(child, \"decimal-format\")) {\n this.processDecimalFormat(child);\n } else if (this.isXsltElement(child, \"namespace-alias\")) {\n this.processNamespaceAlias(child);\n } else if (this.isXsltElement(child, \"attribute-set\")) {\n this.processAttributeSet(child);\n } else if (this.isXsltElement(child, \"strip-space\")) {\n this.processStripSpace(child);\n } else if (this.isXsltElement(child, \"preserve-space\")) {\n this.processPreserveSpace(child);\n } else if (this.isXsltElement(child, \"include\")) {\n this.processInclude(child, stylesheetUri || this.baseUri);\n }\n }\n\n // Increment import precedence after processing this stylesheet\n if (isMainStylesheet) {\n this.currentImportPrecedence++;\n }\n }\n\n /**\n * Process xsl:include element\n * Includes are merged at the same import precedence level\n */\n processInclude(node, baseUri) {\n const href = node.getAttribute(\"href\");\n if (!href) {\n throw new Error(\"xsl:include requires an href attribute\");\n }\n\n const resolvedUri = this.resolveUri(href, baseUri);\n\n // Check for circular includes\n if (this.processedStylesheets.has(resolvedUri)) {\n throw new Error(`Circular stylesheet reference detected: ${resolvedUri}`);\n }\n\n this.processedStylesheets.add(resolvedUri);\n\n try {\n const { document: stylesheetDoc } = this.loadStylesheet(href, baseUri);\n\n // Parse if string\n let doc = stylesheetDoc;\n if (typeof stylesheetDoc === \"string\") {\n doc = this.parseXmlString(stylesheetDoc);\n }\n\n // Process the included stylesheet at the same import precedence\n const savedPrecedence = this.currentImportPrecedence;\n this.processIncludedStylesheet(doc, resolvedUri);\n this.currentImportPrecedence = savedPrecedence;\n } catch (error) {\n throw new Error(\n `Failed to include stylesheet \"${href}\": ${error.message}`,\n );\n }\n }\n\n /**\n * Process xsl:import element\n * Imports have lower precedence than the importing stylesheet\n */\n processImport(node, baseUri) {\n const href = node.getAttribute(\"href\");\n if (!href) {\n throw new Error(\"xsl:import requires an href attribute\");\n }\n\n const resolvedUri = this.resolveUri(href, baseUri);\n\n // Check for circular imports\n if (this.processedStylesheets.has(resolvedUri)) {\n throw new Error(`Circular stylesheet reference detected: ${resolvedUri}`);\n }\n\n this.processedStylesheets.add(resolvedUri);\n\n try {\n const { document: stylesheetDoc } = this.loadStylesheet(href, baseUri);\n\n // Parse if string\n let doc = stylesheetDoc;\n if (typeof stylesheetDoc === \"string\") {\n doc = this.parseXmlString(stylesheetDoc);\n }\n\n // Process the imported stylesheet (imports have lower precedence)\n // Don't increment precedence yet - imported templates get current (lower) precedence\n this.processIncludedStylesheet(doc, resolvedUri);\n\n // After processing import, increment precedence for next imports and main stylesheet\n this.currentImportPrecedence++;\n } catch (error) {\n throw new Error(\n `Failed to import stylesheet \"${href}\": ${error.message}`,\n );\n }\n }\n\n /**\n * Process an included/imported stylesheet document\n */\n processIncludedStylesheet(stylesheetDoc, stylesheetUri) {\n const root = stylesheetDoc.documentElement || stylesheetDoc;\n\n // Validate stylesheet\n if (\n !this.isXsltElement(root, \"stylesheet\") &&\n !this.isXsltElement(root, \"transform\")\n ) {\n throw new Error(\n \"Included/imported document is not a valid XSLT stylesheet\",\n );\n }\n\n // Collect namespaces\n this.collectNamespaces(root);\n\n // Process imports first (they have lower precedence)\n const imports = [];\n const otherElements = [];\n\n for (const child of root.childNodes) {\n if (child.nodeType !== 1) continue;\n\n if (this.isXsltElement(child, \"import\")) {\n imports.push(child);\n } else {\n otherElements.push(child);\n }\n }\n\n // Process nested imports\n for (const importNode of imports) {\n this.processImport(importNode, stylesheetUri);\n }\n\n // Process other elements\n for (const child of otherElements) {\n if (this.isXsltElement(child, \"template\")) {\n this.registerTemplate(child);\n } else if (this.isXsltElement(child, \"output\")) {\n this.processOutput(child);\n } else if (this.isXsltElement(child, \"variable\")) {\n this.processGlobalVariable(child);\n } else if (this.isXsltElement(child, \"param\")) {\n this.processGlobalParam(child);\n } else if (this.isXsltElement(child, \"key\")) {\n this.processKey(child);\n } else if (this.isXsltElement(child, \"decimal-format\")) {\n this.processDecimalFormat(child);\n } else if (this.isXsltElement(child, \"namespace-alias\")) {\n this.processNamespaceAlias(child);\n } else if (this.isXsltElement(child, \"attribute-set\")) {\n this.processAttributeSet(child);\n } else if (this.isXsltElement(child, \"strip-space\")) {\n this.processStripSpace(child);\n } else if (this.isXsltElement(child, \"preserve-space\")) {\n this.processPreserveSpace(child);\n } else if (this.isXsltElement(child, \"include\")) {\n this.processInclude(child, stylesheetUri);\n }\n }\n }\n\n processLiteralResultStylesheet(root) {\n // Simplified stylesheet - entire document is one template matching /\n this.templates.push({\n match: \"/\",\n name: null,\n mode: null,\n priority: 0.5,\n node: root,\n });\n }\n\n collectNamespaces(node) {\n if (!node.attributes) return;\n\n for (const attr of node.attributes) {\n if (attr.name.startsWith(\"xmlns:\")) {\n const prefix = attr.name.substring(6);\n if (attr.value !== XSLT_NS) {\n this.namespaces[prefix] = attr.value;\n }\n } else if (attr.name === \"xmlns\" && attr.value !== XSLT_NS) {\n this.namespaces[\"\"] = attr.value;\n }\n }\n }\n\n registerTemplate(node) {\n const match = node.getAttribute(\"match\");\n const name = node.getAttribute(\"name\");\n const mode = node.getAttribute(\"mode\") || null;\n const priorityAttr = node.getAttribute(\"priority\");\n const priority = priorityAttr\n ? parseFloat(priorityAttr)\n : this.calculatePriority(match);\n\n this.templates.push({\n match,\n name,\n mode,\n priority,\n importPrecedence: this.currentImportPrecedence,\n node,\n });\n }\n\n calculatePriority(matchPattern) {\n if (!matchPattern) return 0.5;\n\n // Simplified priority calculation based on XPath 1.0 spec\n // - NodeType or * have priority -0.5\n // - NCName:* has priority -0.25\n // - QName has priority 0\n // - Other patterns have priority 0.5\n\n if (\n matchPattern === \"*\" ||\n matchPattern === \"node()\" ||\n matchPattern === \"text()\" ||\n matchPattern === \"comment()\" ||\n matchPattern === \"processing-instruction()\"\n ) {\n return -0.5;\n }\n\n if (matchPattern.includes(\":*\")) {\n return -0.25;\n }\n\n if (/^[a-zA-Z_][\\w.-]*$/.test(matchPattern)) {\n return 0;\n }\n\n return 0.5;\n }\n\n processOutput(node) {\n const method = node.getAttribute(\"method\");\n if (method) this.outputSettings.method = method;\n\n const encoding = node.getAttribute(\"encoding\");\n if (encoding) this.outputSettings.encoding = encoding;\n\n const indent = node.getAttribute(\"indent\");\n if (indent) this.outputSettings.indent = indent;\n\n const omit = node.getAttribute(\"omit-xml-declaration\");\n if (omit) this.outputSettings.omitXmlDeclaration = omit;\n\n const doctypePublic = node.getAttribute(\"doctype-public\");\n if (doctypePublic) this.outputSettings.doctypePublic = doctypePublic;\n\n const doctypeSystem = node.getAttribute(\"doctype-system\");\n if (doctypeSystem) this.outputSettings.doctypeSystem = doctypeSystem;\n\n const mediaType = node.getAttribute(\"media-type\");\n if (mediaType) this.outputSettings.mediaType = mediaType;\n\n const cdataElements = node.getAttribute(\"cdata-section-elements\");\n if (cdataElements) {\n this.outputSettings.cdataSectionElements = cdataElements\n .split(/\\s+/)\n .filter(Boolean);\n }\n }\n\n processGlobalVariable(node) {\n const name = node.getAttribute(\"name\");\n const select = node.getAttribute(\"select\");\n\n this.globalVariables[name] = { node, select };\n }\n\n processGlobalParam(node) {\n const name = node.getAttribute(\"name\");\n const select = node.getAttribute(\"select\");\n\n this.globalParameters[name] = { node, select };\n }\n\n processKey(node) {\n const name = node.getAttribute(\"name\");\n const match = node.getAttribute(\"match\");\n const use = node.getAttribute(\"use\");\n\n this.keys[name] = { match, use };\n }\n\n processDecimalFormat(node) {\n const name = node.getAttribute(\"name\") || \"\";\n\n this.decimalFormats[name] = {\n decimalSeparator: node.getAttribute(\"decimal-separator\") || \".\",\n groupingSeparator: node.getAttribute(\"grouping-separator\") || \",\",\n percent: node.getAttribute(\"percent\") || \"%\",\n perMille: node.getAttribute(\"per-mille\") || \"\\u2030\",\n zeroDigit: node.getAttribute(\"zero-digit\") || \"0\",\n digit: node.getAttribute(\"digit\") || \"#\",\n patternSeparator: node.getAttribute(\"pattern-separator\") || \";\",\n infinity: node.getAttribute(\"infinity\") || \"Infinity\",\n nan: node.getAttribute(\"NaN\") || \"NaN\",\n minusSign: node.getAttribute(\"minus-sign\") || \"-\",\n };\n }\n\n processNamespaceAlias(node) {\n const stylesheet = node.getAttribute(\"stylesheet-prefix\");\n const result = node.getAttribute(\"result-prefix\");\n this.namespaceAliases[stylesheet] = result;\n }\n\n processAttributeSet(node) {\n const name = node.getAttribute(\"name\");\n const useAttributeSets = node.getAttribute(\"use-attribute-sets\");\n\n this.attributeSets[name] = {\n node,\n useAttributeSets: useAttributeSets\n ? useAttributeSets.split(/\\s+/).filter(Boolean)\n : [],\n };\n }\n\n processStripSpace(node) {\n const elements = node.getAttribute(\"elements\");\n if (elements) {\n this.stripSpace.push(...elements.split(/\\s+/).filter(Boolean));\n }\n }\n\n processPreserveSpace(node) {\n const elements = node.getAttribute(\"elements\");\n if (elements) {\n this.preserveSpace.push(...elements.split(/\\s+/).filter(Boolean));\n }\n }\n\n /**\n * Transform a source document\n */\n transform(sourceNode, ownerDocument) {\n const doc =\n ownerDocument || (typeof document !== \"undefined\" ? document : null);\n\n if (!doc) {\n throw new Error(\"No output document available\");\n }\n\n // Create context - use document node as initial context for \"/\" template matching\n // XPath paths like \"RootElement/child\" expect to start from document node\n const context = new XsltContext({\n currentNode: sourceNode,\n currentNodeList: [sourceNode],\n position: 1,\n outputDocument: doc,\n stylesheet: this.stylesheetDoc,\n namespaces: { ...this.namespaces },\n templates: this.templates,\n keys: this.keys,\n decimalFormats: this.decimalFormats,\n outputMethod: this.outputSettings.method,\n xpathEvaluator: this.xpathEvaluator,\n });\n\n // Evaluate global variables\n for (const [name, def] of Object.entries(this.globalParameters)) {\n if (!(name in context.parameters)) {\n context.parameters[name] = this.evaluateVariable(def, context);\n }\n }\n\n for (const [name, def] of Object.entries(this.globalVariables)) {\n context.variables[name] = this.evaluateVariable(def, context);\n }\n\n // Create result document fragment\n const fragment = doc.createDocumentFragment();\n\n // Apply templates to document node (not documentElement)\n // This ensures \"/\" template has document as context, so paths like\n // \"RootElement/child\" work correctly\n this.applyTemplates([sourceNode], null, context, fragment);\n\n return fragment;\n }\n\n /**\n * Transform to a complete document\n */\n transformToDocument(sourceNode) {\n // For Node.js environments, we need a document implementation\n const doc = this.createDocument();\n const fragment = this.transform(sourceNode, doc);\n\n // Move fragment contents to document\n while (fragment.firstChild) {\n doc.appendChild(fragment.firstChild);\n }\n\n return doc;\n }\n\n createDocument() {\n if (typeof document !== \"undefined\") {\n return document.implementation.createDocument(null, null, null);\n }\n\n // For Node.js - would need JSDOM or similar\n throw new Error(\"Document creation not available in this environment\");\n }\n\n evaluateVariable(def, context) {\n if (def.select) {\n return this.evaluateXPath(def.select, context);\n }\n\n // If no select, evaluate content as result tree fragment\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(def.node, context, fragment);\n return fragment;\n }\n\n /**\n * Apply templates to a node list\n */\n applyTemplates(nodes, mode, context, output) {\n const nodeList = Array.isArray(nodes) ? nodes : [nodes];\n\n for (let i = 0; i < nodeList.length; i++) {\n const node = nodeList[i];\n const template = this.findMatchingTemplate(node, mode, context);\n\n if (template) {\n const newContext = context.clone({\n currentNode: node,\n currentNodeList: nodeList,\n position: i + 1,\n });\n\n this.processTemplate(template.node, newContext, output);\n } else {\n // Built-in templates\n this.applyBuiltinTemplate(node, mode, context, output);\n }\n }\n }\n\n /**\n * Find the best matching template for a node\n */\n findMatchingTemplate(node, mode, context) {\n let bestMatch = null;\n let bestPriority = -Infinity;\n let bestImportPrecedence = -Infinity;\n\n for (const template of this.templates) {\n if (template.mode !== mode) continue;\n if (!template.match) continue;\n\n if (this.matchesPattern(node, template.match, context)) {\n const priority = template.priority;\n const importPrecedence = template.importPrecedence || 0;\n\n if (\n importPrecedence > bestImportPrecedence ||\n (importPrecedence === bestImportPrecedence && priority > bestPriority)\n ) {\n bestMatch = template;\n bestPriority = priority;\n bestImportPrecedence = importPrecedence;\n }\n }\n }\n\n return bestMatch;\n }\n\n /**\n * Check if a node matches an XSLT pattern\n */\n matchesPattern(node, pattern, context) {\n // Split union patterns\n const patterns = this.splitUnionPattern(pattern);\n\n for (const p of patterns) {\n if (this.matchesSinglePattern(node, p.trim(), context)) {\n return true;\n }\n }\n\n return false;\n }\n\n splitUnionPattern(pattern) {\n // Simple split on | not inside predicates or strings\n const parts = [];\n let current = \"\";\n let depth = 0;\n let inString = false;\n let stringChar = \"\";\n\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i];\n\n if (inString) {\n current += char;\n if (char === stringChar) {\n inString = false;\n }\n } else if (char === '\"' || char === \"'\") {\n inString = true;\n stringChar = char;\n current += char;\n } else if (char === \"[\") {\n depth++;\n current += char;\n } else if (char === \"]\") {\n depth--;\n current += char;\n } else if (char === \"|\" && depth === 0) {\n parts.push(current);\n current = \"\";\n } else {\n current += char;\n }\n }\n\n if (current) {\n parts.push(current);\n }\n\n return parts;\n }\n\n matchesSinglePattern(node, pattern, context) {\n try {\n // Handle root pattern\n if (pattern === \"/\") {\n return (\n node.nodeType === 9 || node === node.ownerDocument?.documentElement\n );\n }\n\n // Handle patterns like \"item\" (child match)\n // Need to check if node would be selected by pattern from parent\n const ast = parseXPath(pattern);\n\n // For patterns starting with /, evaluate from root\n if (pattern.startsWith(\"/\")) {\n const doc = node.ownerDocument || node;\n const xpathContext = new XPathContext(\n doc,\n 1,\n 1,\n { ...context.variables, ...context.parameters },\n context.namespaces,\n );\n const result = this.xpathEvaluator.evaluate(ast, xpathContext);\n const nodes = Array.isArray(result) ? result : [result];\n return nodes.includes(node);\n }\n\n // For relative patterns, check if this node matches when evaluated from parent\n if (node.parentNode) {\n const xpathContext = new XPathContext(\n node.parentNode,\n 1,\n 1,\n { ...context.variables, ...context.parameters },\n context.namespaces,\n );\n const result = this.xpathEvaluator.evaluate(ast, xpathContext);\n const nodes = Array.isArray(result) ? result : [result];\n return nodes.includes(node);\n }\n\n // For document node without parent\n const xpathContext = new XPathContext(\n node,\n 1,\n 1,\n { ...context.variables, ...context.parameters },\n context.namespaces,\n );\n const result = this.xpathEvaluator.evaluate(ast, xpathContext);\n const nodes = Array.isArray(result) ? result : [result];\n return nodes.includes(node);\n } catch {\n return false;\n }\n }\n\n /**\n * Apply built-in template rules\n */\n applyBuiltinTemplate(node, mode, context, output) {\n switch (node.nodeType) {\n case 1: // Element\n case 9: // Document\n case 11: // Document Fragment\n // Process children\n this.applyTemplates(Array.from(node.childNodes), mode, context, output);\n break;\n\n case 3: // Text\n case 4: {\n // CDATA\n // Copy text value\n const text = context.outputDocument.createTextNode(\n node.nodeValue || \"\",\n );\n output.appendChild(text);\n break;\n }\n\n case 2: {\n // Attribute\n // Copy attribute value as text\n const attrText = context.outputDocument.createTextNode(\n node.nodeValue || \"\",\n );\n output.appendChild(attrText);\n break;\n }\n\n // Comments and PIs have no built-in template\n }\n }\n\n /**\n * Process template content\n */\n processTemplate(templateNode, context, output) {\n // Process template parameters first\n const localContext = context.clone();\n\n for (const child of templateNode.childNodes) {\n if (child.nodeType === 1 && this.isXsltElement(child, \"param\")) {\n const name = child.getAttribute(\"name\");\n if (!(name in localContext.parameters)) {\n localContext.parameters[name] = this.evaluateVariable(\n { node: child, select: child.getAttribute(\"select\") },\n localContext,\n );\n }\n }\n }\n\n this.processChildren(templateNode, localContext, output);\n }\n\n /**\n * Process child nodes of an XSLT element\n */\n processChildren(node, context, output) {\n for (const child of node.childNodes) {\n this.processNode(child, context, output);\n }\n }\n\n /**\n * Process a single node in the stylesheet\n */\n processNode(node, context, output) {\n switch (node.nodeType) {\n case 1: // Element\n this.processElement(node, context, output);\n break;\n\n case 3: // Text\n case 4: {\n // CDATA\n // Output text if not whitespace only (or if preserving space)\n const text = node.nodeValue;\n if (text && (text.trim() || this.shouldPreserveSpace(node))) {\n const textNode = context.outputDocument.createTextNode(text);\n output.appendChild(textNode);\n }\n break;\n }\n }\n }\n\n shouldPreserveSpace(node) {\n // Check xml:space attribute on ancestors\n let current = node.parentNode;\n while (current && current.nodeType === 1) {\n const space = current.getAttribute(\"xml:space\");\n if (space === \"preserve\") return true;\n if (space === \"default\") return false;\n current = current.parentNode;\n }\n return false;\n }\n\n /**\n * Process an element in the stylesheet\n */\n processElement(node, context, output) {\n // Check if XSLT element\n if (this.isXsltNamespace(node)) {\n this.processXsltElement(node, context, output);\n } else {\n // Literal result element\n this.processLiteralResultElement(node, context, output);\n }\n }\n\n /**\n * Process an XSLT instruction element\n */\n processXsltElement(node, context, output) {\n const localName = node.localName || node.nodeName.replace(/^xsl:/, \"\");\n\n switch (localName) {\n case \"apply-templates\":\n this.xslApplyTemplates(node, context, output);\n break;\n\n case \"call-template\":\n this.xslCallTemplate(node, context, output);\n break;\n\n case \"value-of\":\n this.xslValueOf(node, context, output);\n break;\n\n case \"text\":\n this.xslText(node, context, output);\n break;\n\n case \"element\":\n this.xslElement(node, context, output);\n break;\n\n case \"attribute\":\n this.xslAttribute(node, context, output);\n break;\n\n case \"if\":\n this.xslIf(node, context, output);\n break;\n\n case \"choose\":\n this.xslChoose(node, context, output);\n break;\n\n case \"for-each\":\n this.xslForEach(node, context, output);\n break;\n\n case \"copy\":\n this.xslCopy(node, context, output);\n break;\n\n case \"copy-of\":\n this.xslCopyOf(node, context, output);\n break;\n\n case \"variable\":\n this.xslVariable(node, context, output);\n break;\n\n case \"param\":\n // Params are processed at template start\n break;\n\n case \"comment\":\n this.xslComment(node, context, output);\n break;\n\n case \"processing-instruction\":\n this.xslProcessingInstruction(node, context, output);\n break;\n\n case \"number\":\n this.xslNumber(node, context, output);\n break;\n\n case \"sort\":\n // Handled by apply-templates and for-each\n break;\n\n case \"with-param\":\n // Handled by call-template and apply-templates\n break;\n\n case \"message\":\n this.xslMessage(node, context, output);\n break;\n\n case \"fallback\":\n // Used for forward compatibility\n break;\n\n default:\n console.warn(`Unknown XSLT element: ${localName}`);\n }\n }\n\n /**\n * Process a literal result element (non-XSLT)\n */\n processLiteralResultElement(node, context, output) {\n // Create element in output\n let outputElement;\n const namespaceURI = node.namespaceURI;\n const nodeName = node.nodeName;\n\n // Apply namespace aliases\n let resolvedNS = namespaceURI;\n if (namespaceURI) {\n for (const [from, to] of Object.entries(this.namespaceAliases)) {\n if (this.namespaces[from] === namespaceURI) {\n resolvedNS = this.namespaces[to] || to;\n break;\n }\n }\n }\n\n if (resolvedNS && context.outputDocument.createElementNS) {\n outputElement = context.outputDocument.createElementNS(\n resolvedNS,\n nodeName,\n );\n } else {\n outputElement = context.outputDocument.createElement(nodeName);\n }\n\n // Copy attributes (except XSLT namespace)\n if (node.attributes) {\n for (const attr of node.attributes) {\n if (attr.namespaceURI === XSLT_NS) continue;\n if (attr.name.startsWith(\"xmlns\")) continue;\n\n // Process attribute value templates\n const value = this.processAttributeValueTemplate(attr.value, context);\n outputElement.setAttribute(attr.name, value);\n }\n }\n\n // Process children\n this.processChildren(node, context, outputElement);\n\n output.appendChild(outputElement);\n }\n\n /**\n * Process attribute value templates (expressions in curly braces)\n */\n processAttributeValueTemplate(value, context) {\n if (!value.includes(\"{\")) return value;\n\n let result = \"\";\n let i = 0;\n\n while (i < value.length) {\n if (value[i] === \"{\") {\n if (value[i + 1] === \"{\") {\n // Escaped brace\n result += \"{\";\n i += 2;\n } else {\n // Find closing brace\n let depth = 1;\n let j = i + 1;\n while (j < value.length && depth > 0) {\n if (value[j] === \"{\") depth++;\n else if (value[j] === \"}\") depth--;\n j++;\n }\n\n const expr = value.substring(i + 1, j - 1);\n const evalResult = this.evaluateXPath(expr, context);\n result += this.xpathEvaluator.toString(evalResult);\n i = j;\n }\n } else if (value[i] === \"}\") {\n if (value[i + 1] === \"}\") {\n // Escaped brace\n result += \"}\";\n i += 2;\n } else {\n throw new Error(\"Unmatched } in attribute value template\");\n }\n } else {\n result += value[i];\n i++;\n }\n }\n\n return result;\n }\n\n // XSLT Instructions\n xslApplyTemplates(node, context, output) {\n const select = node.getAttribute(\"select\") || \"node()\";\n const mode = node.getAttribute(\"mode\") || null;\n\n // Evaluate select expression\n let nodes = this.evaluateXPath(select, context);\n if (!Array.isArray(nodes)) {\n nodes = nodes ? [nodes] : [];\n }\n\n // Collect sort specifications\n const sortSpecs = [];\n for (const child of node.childNodes) {\n if (child.nodeType === 1 && this.isXsltElement(child, \"sort\")) {\n sortSpecs.push({\n select: child.getAttribute(\"select\") || \".\",\n order: child.getAttribute(\"order\") || \"ascending\",\n dataType: child.getAttribute(\"data-type\") || \"text\",\n caseOrder: child.getAttribute(\"case-order\") || \"upper-first\",\n lang: child.getAttribute(\"lang\"),\n });\n }\n }\n\n // Apply sorting\n if (sortSpecs.length > 0) {\n nodes = this.sortNodes(nodes, sortSpecs, context);\n }\n\n // Collect with-param values\n const params = {};\n for (const child of node.childNodes) {\n if (child.nodeType === 1 && this.isXsltElement(child, \"with-param\")) {\n const name = child.getAttribute(\"name\");\n const selectAttr = child.getAttribute(\"select\");\n if (selectAttr) {\n params[name] = this.evaluateXPath(selectAttr, context);\n } else {\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(child, context, fragment);\n params[name] = fragment;\n }\n }\n }\n\n // Apply templates with new context including params\n const newContext = context.clone({\n parameters: { ...context.parameters, ...params },\n });\n this.applyTemplates(nodes, mode, newContext, output);\n }\n\n xslCallTemplate(node, context, output) {\n const name = node.getAttribute(\"name\");\n\n // Find named template\n const template = this.templates.find((t) => t.name === name);\n if (!template) {\n throw new Error(`Template not found: ${name}`);\n }\n\n // Collect with-param values\n const params = {};\n for (const child of node.childNodes) {\n if (child.nodeType === 1 && this.isXsltElement(child, \"with-param\")) {\n const paramName = child.getAttribute(\"name\");\n const selectAttr = child.getAttribute(\"select\");\n if (selectAttr) {\n params[paramName] = this.evaluateXPath(selectAttr, context);\n } else {\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(child, context, fragment);\n params[paramName] = fragment;\n }\n }\n }\n\n // Call template with params\n const newContext = context.clone({\n parameters: { ...context.parameters, ...params },\n });\n this.processTemplate(template.node, newContext, output);\n }\n\n xslValueOf(node, context, output) {\n const select = node.getAttribute(\"select\");\n const disableOutputEscaping =\n node.getAttribute(\"disable-output-escaping\") === \"yes\";\n\n const result = this.evaluateXPath(select, context);\n const text = this.xpathEvaluator.toString(result);\n\n if (text) {\n const textNode = context.outputDocument.createTextNode(text);\n if (disableOutputEscaping) {\n textNode._disableOutputEscaping = true;\n }\n output.appendChild(textNode);\n }\n }\n\n xslText(node, context, output) {\n const disableOutputEscaping =\n node.getAttribute(\"disable-output-escaping\") === \"yes\";\n let text = \"\";\n\n for (const child of node.childNodes) {\n if (child.nodeType === 3 || child.nodeType === 4) {\n text += child.nodeValue || \"\";\n }\n }\n\n if (text) {\n const textNode = context.outputDocument.createTextNode(text);\n if (disableOutputEscaping) {\n textNode._disableOutputEscaping = true;\n }\n output.appendChild(textNode);\n }\n }\n\n xslElement(node, context, output) {\n const name = this.processAttributeValueTemplate(\n node.getAttribute(\"name\"),\n context,\n );\n const namespace = node.getAttribute(\"namespace\");\n const useAttributeSets = node.getAttribute(\"use-attribute-sets\");\n\n let element;\n if (namespace) {\n const ns = this.processAttributeValueTemplate(namespace, context);\n element = context.outputDocument.createElementNS(ns, name);\n } else {\n element = context.outputDocument.createElement(name);\n }\n\n // Apply attribute sets\n if (useAttributeSets) {\n this.applyAttributeSets(useAttributeSets, context, element);\n }\n\n this.processChildren(node, context, element);\n output.appendChild(element);\n }\n\n xslAttribute(node, context, output) {\n const name = this.processAttributeValueTemplate(\n node.getAttribute(\"name\"),\n context,\n );\n const namespace = node.getAttribute(\"namespace\");\n\n // Collect content\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(node, context, fragment);\n\n // Get text content\n let value = \"\";\n const getText = (n) => {\n if (n.nodeType === 3 || n.nodeType === 4) {\n value += n.nodeValue || \"\";\n } else if (n.childNodes) {\n for (const child of n.childNodes) {\n getText(child);\n }\n }\n };\n getText(fragment);\n\n // Add attribute to parent element\n if (output.nodeType === 1) {\n if (namespace) {\n const ns = this.processAttributeValueTemplate(namespace, context);\n output.setAttributeNS(ns, name, value);\n } else {\n output.setAttribute(name, value);\n }\n }\n }\n\n xslIf(node, context, output) {\n const test = node.getAttribute(\"test\");\n const result = this.evaluateXPath(test, context);\n\n if (this.xpathEvaluator.toBoolean(result)) {\n this.processChildren(node, context, output);\n }\n }\n\n xslChoose(node, context, output) {\n for (const child of node.childNodes) {\n if (child.nodeType !== 1) continue;\n\n if (this.isXsltElement(child, \"when\")) {\n const test = child.getAttribute(\"test\");\n const result = this.evaluateXPath(test, context);\n\n if (this.xpathEvaluator.toBoolean(result)) {\n this.processChildren(child, context, output);\n return;\n }\n } else if (this.isXsltElement(child, \"otherwise\")) {\n this.processChildren(child, context, output);\n return;\n }\n }\n }\n\n xslForEach(node, context, output) {\n const select = node.getAttribute(\"select\");\n\n let nodes = this.evaluateXPath(select, context);\n if (!Array.isArray(nodes)) {\n nodes = nodes ? [nodes] : [];\n }\n\n // Collect sort specifications\n const sortSpecs = [];\n for (const child of node.childNodes) {\n if (child.nodeType === 1 && this.isXsltElement(child, \"sort\")) {\n sortSpecs.push({\n select: child.getAttribute(\"select\") || \".\",\n order: child.getAttribute(\"order\") || \"ascending\",\n dataType: child.getAttribute(\"data-type\") || \"text\",\n caseOrder: child.getAttribute(\"case-order\") || \"upper-first\",\n lang: child.getAttribute(\"lang\"),\n });\n }\n }\n\n // Apply sorting\n if (sortSpecs.length > 0) {\n nodes = this.sortNodes(nodes, sortSpecs, context);\n }\n\n // Process each node\n for (let i = 0; i < nodes.length; i++) {\n const newContext = context.clone({\n currentNode: nodes[i],\n currentNodeList: nodes,\n position: i + 1,\n });\n\n this.processChildren(node, newContext, output);\n }\n }\n\n xslCopy(node, context, output) {\n const currentNode = context.currentNode;\n const useAttributeSets = node.getAttribute(\"use-attribute-sets\");\n\n switch (currentNode.nodeType) {\n case 1: {\n // Element\n let copy;\n if (currentNode.namespaceURI) {\n copy = context.outputDocument.createElementNS(\n currentNode.namespaceURI,\n currentNode.nodeName,\n );\n } else {\n copy = context.outputDocument.createElement(currentNode.nodeName);\n }\n\n if (useAttributeSets) {\n this.applyAttributeSets(useAttributeSets, context, copy);\n }\n\n this.processChildren(node, context, copy);\n output.appendChild(copy);\n break;\n }\n\n case 2: // Attribute\n if (output.nodeType === 1) {\n output.setAttribute(currentNode.name, currentNode.value);\n }\n break;\n\n case 3: // Text\n case 4: {\n // CDATA\n const textCopy = context.outputDocument.createTextNode(\n currentNode.nodeValue || \"\",\n );\n output.appendChild(textCopy);\n break;\n }\n\n case 7: {\n // Processing Instruction\n const piCopy = context.outputDocument.createProcessingInstruction(\n currentNode.target,\n currentNode.data,\n );\n output.appendChild(piCopy);\n break;\n }\n\n case 8: {\n // Comment\n const commentCopy = context.outputDocument.createComment(\n currentNode.nodeValue || \"\",\n );\n output.appendChild(commentCopy);\n break;\n }\n\n case 9: // Document\n case 11: // Document Fragment\n this.processChildren(node, context, output);\n break;\n }\n }\n\n xslCopyOf(node, context, output) {\n const select = node.getAttribute(\"select\");\n const result = this.evaluateXPath(select, context);\n\n this.copyToOutput(result, context, output);\n }\n\n copyToOutput(value, context, output) {\n if (Array.isArray(value)) {\n for (const item of value) {\n this.copyToOutput(item, context, output);\n }\n return;\n }\n\n if (value && value.nodeType) {\n // Deep copy node\n const clone = this.deepCloneNode(value, context.outputDocument);\n output.appendChild(clone);\n } else if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n const text = context.outputDocument.createTextNode(String(value));\n output.appendChild(text);\n }\n }\n\n deepCloneNode(node, targetDoc) {\n switch (node.nodeType) {\n case 1: {\n // Element\n let clone;\n if (node.namespaceURI && targetDoc.createElementNS) {\n clone = targetDoc.createElementNS(node.namespaceURI, node.nodeName);\n } else {\n clone = targetDoc.createElement(node.nodeName);\n }\n\n if (node.attributes) {\n for (const attr of node.attributes) {\n clone.setAttribute(attr.name, attr.value);\n }\n }\n\n for (const child of node.childNodes) {\n clone.appendChild(this.deepCloneNode(child, targetDoc));\n }\n\n return clone;\n }\n\n case 3: // Text\n case 4: // CDATA\n return targetDoc.createTextNode(node.nodeValue || \"\");\n\n case 7: // Processing Instruction\n return targetDoc.createProcessingInstruction(node.target, node.data);\n\n case 8: // Comment\n return targetDoc.createComment(node.nodeValue || \"\");\n\n case 11: {\n // Document Fragment\n const frag = targetDoc.createDocumentFragment();\n for (const child of node.childNodes) {\n frag.appendChild(this.deepCloneNode(child, targetDoc));\n }\n return frag;\n }\n\n default:\n return targetDoc.createTextNode(\"\");\n }\n }\n\n xslVariable(node, context, _output) {\n const name = node.getAttribute(\"name\");\n const select = node.getAttribute(\"select\");\n\n let value;\n if (select) {\n value = this.evaluateXPath(select, context);\n } else {\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(node, context, fragment);\n value = fragment;\n }\n\n context.setVariable(name, value);\n }\n\n xslComment(node, context, output) {\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(node, context, fragment);\n\n let text = \"\";\n const getText = (n) => {\n if (n.nodeType === 3 || n.nodeType === 4) {\n text += n.nodeValue || \"\";\n } else if (n.childNodes) {\n for (const child of n.childNodes) {\n getText(child);\n }\n }\n };\n getText(fragment);\n\n const comment = context.outputDocument.createComment(text);\n output.appendChild(comment);\n }\n\n xslProcessingInstruction(node, context, output) {\n const name = this.processAttributeValueTemplate(\n node.getAttribute(\"name\"),\n context,\n );\n\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(node, context, fragment);\n\n let data = \"\";\n const getText = (n) => {\n if (n.nodeType === 3 || n.nodeType === 4) {\n data += n.nodeValue || \"\";\n } else if (n.childNodes) {\n for (const child of n.childNodes) {\n getText(child);\n }\n }\n };\n getText(fragment);\n\n const pi = context.outputDocument.createProcessingInstruction(name, data);\n output.appendChild(pi);\n }\n\n xslNumber(node, context, output) {\n const value = node.getAttribute(\"value\");\n const format = node.getAttribute(\"format\") || \"1\";\n const level = node.getAttribute(\"level\") || \"single\";\n\n let number;\n if (value) {\n number = Math.round(\n this.xpathEvaluator.toNumber(this.evaluateXPath(value, context)),\n );\n } else {\n // Count based on level\n number = this.countNumber(context.currentNode, level, node, context);\n }\n\n const formatted = this.formatNumber(number, format);\n const text = context.outputDocument.createTextNode(formatted);\n output.appendChild(text);\n }\n\n countNumber(node, level, spec, context) {\n const count = spec.getAttribute(\"count\");\n const _from = spec.getAttribute(\"from\");\n\n // Simplified implementation\n if (level === \"single\") {\n // Count preceding siblings matching pattern\n let n = 1;\n let sibling = node.previousSibling;\n while (sibling) {\n if (sibling.nodeType === 1) {\n if (!count || this.matchesPattern(sibling, count, context)) {\n n++;\n }\n }\n sibling = sibling.previousSibling;\n }\n return n;\n }\n\n return 1;\n }\n\n formatNumber(number, format) {\n // Simple format implementation\n if (/^[0-9]+$/.test(format)) {\n return String(number).padStart(format.length, \"0\");\n }\n\n if (format === \"a\") {\n return String.fromCharCode(96 + ((number - 1) % 26) + 1);\n }\n\n if (format === \"A\") {\n return String.fromCharCode(64 + ((number - 1) % 26) + 1);\n }\n\n if (format === \"i\") {\n return this.toRoman(number).toLowerCase();\n }\n\n if (format === \"I\") {\n return this.toRoman(number);\n }\n\n return String(number);\n }\n\n toRoman(num) {\n const romanNumerals = [\n [\"M\", 1000],\n [\"CM\", 900],\n [\"D\", 500],\n [\"CD\", 400],\n [\"C\", 100],\n [\"XC\", 90],\n [\"L\", 50],\n [\"XL\", 40],\n [\"X\", 10],\n [\"IX\", 9],\n [\"V\", 5],\n [\"IV\", 4],\n [\"I\", 1],\n ];\n\n let result = \"\";\n for (const [numeral, value] of romanNumerals) {\n while (num >= value) {\n result += numeral;\n num -= value;\n }\n }\n return result;\n }\n\n xslMessage(node, context, _output) {\n const terminate = node.getAttribute(\"terminate\") === \"yes\";\n\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(node, context, fragment);\n\n let text = \"\";\n const getText = (n) => {\n if (n.nodeType === 3 || n.nodeType === 4) {\n text += n.nodeValue || \"\";\n } else if (n.childNodes) {\n for (const child of n.childNodes) {\n getText(child);\n }\n }\n };\n getText(fragment);\n\n console.log(\"XSLT Message:\", text);\n\n if (terminate) {\n throw new Error(`XSLT terminated: ${text}`);\n }\n }\n\n applyAttributeSets(names, context, element) {\n const setNames = names.split(/\\s+/).filter(Boolean);\n\n for (const name of setNames) {\n const attrSet = this.attributeSets[name];\n if (attrSet) {\n // Apply inherited sets first\n if (attrSet.useAttributeSets.length > 0) {\n this.applyAttributeSets(\n attrSet.useAttributeSets.join(\" \"),\n context,\n element,\n );\n }\n\n // Apply attributes from this set\n for (const child of attrSet.node.childNodes) {\n if (child.nodeType === 1 && this.isXsltElement(child, \"attribute\")) {\n this.xslAttribute(child, context, element);\n }\n }\n }\n }\n }\n\n sortNodes(nodes, sortSpecs, context) {\n return [...nodes].sort((a, b) => {\n for (const spec of sortSpecs) {\n const contextA = context.clone({ currentNode: a });\n const contextB = context.clone({ currentNode: b });\n\n let valueA = this.evaluateXPath(spec.select, contextA);\n let valueB = this.evaluateXPath(spec.select, contextB);\n\n // Convert to string for comparison (ensure non-null values)\n valueA = this.xpathEvaluator.toString(valueA) || \"\";\n valueB = this.xpathEvaluator.toString(valueB) || \"\";\n\n if (spec.dataType === \"number\") {\n valueA = parseFloat(valueA) || 0;\n valueB = parseFloat(valueB) || 0;\n } else {\n // Text comparison\n if (spec.caseOrder === \"lower-first\") {\n valueA = valueA.toLowerCase();\n valueB = valueB.toLowerCase();\n } else {\n valueA = valueA.toUpperCase();\n valueB = valueB.toUpperCase();\n }\n }\n\n let cmp;\n if (typeof valueA === \"number\") {\n cmp = valueA - valueB;\n } else {\n cmp = valueA.localeCompare(valueB, spec.lang || undefined);\n }\n\n if (spec.order === \"descending\") {\n cmp = -cmp;\n }\n\n if (cmp !== 0) return cmp;\n }\n\n return 0;\n });\n }\n\n evaluateXPath(expr, context) {\n const ast = parseXPath(expr);\n const xpathContext = new XPathContext(\n context.currentNode,\n context.position,\n context.currentNodeList.length,\n { ...context.variables, ...context.parameters },\n context.namespaces,\n );\n return this.xpathEvaluator.evaluate(ast, xpathContext);\n }\n\n isXsltNamespace(node) {\n return (\n node.namespaceURI === XSLT_NS ||\n (node.nodeName && node.nodeName.startsWith(\"xsl:\"))\n );\n }\n\n isXsltElement(node, localName) {\n if (node.nodeType !== 1) return false;\n\n const nodeName = node.localName || node.nodeName;\n return (\n (node.namespaceURI === XSLT_NS && nodeName === localName) ||\n node.nodeName === `xsl:${localName}`\n );\n }\n}\n", "/**\n * XSLTProcessor - JavaScript Implementation\n *\n * Native-compatible XSLTProcessor implementation for browser environments.\n * Based on W3C DOM Level 3 XSL Transformations and XSLT 1.0 Specification.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/API/XSLTProcessor\n * XSLT 1.0: http://www.w3.org/TR/1999/REC-xslt-19991116\n * XPath 1.0: http://www.w3.org/TR/1999/REC-xpath-19991116\n *\n * This implementation provides 1:1 API compatibility with the native\n * browser XSLTProcessor. It can be used as a replacement when native\n * XSLT support is deprecated or unavailable.\n */\n\nimport { XsltEngine } from \"./xslt/engine.js\";\n\n/**\n * XSLTProcessor\n *\n * Applies XSLT stylesheet transformations to XML documents.\n *\n * @example\n * const processor = new XSLTProcessor();\n * processor.importStylesheet(xsltDoc);\n * const fragment = processor.transformToFragment(xmlDoc, document);\n */\nexport class XSLTProcessor {\n constructor() {\n this._engine = null;\n this._stylesheet = null;\n this._parameters = new Map();\n }\n\n /**\n * Imports the XSLT stylesheet.\n *\n * If the given node is a document node, you can pass in a full XSL Transform\n * or a literal result element transform; otherwise, it must be an\n * <xsl:stylesheet> or <xsl:transform> element.\n *\n * @param {Node} style - The XSLT stylesheet to import (Document or Element)\n * @returns {void}\n *\n * @example\n * const parser = new DOMParser();\n * const xslDoc = parser.parseFromString(xslText, 'application/xml');\n * processor.importStylesheet(xslDoc);\n */\n importStylesheet(style) {\n if (!style) {\n throw new TypeError(\n \"Failed to execute 'importStylesheet' on 'XSLTProcessor': 1 argument required, but only 0 present.\",\n );\n }\n\n // Validate node type\n if (style.nodeType !== 1 && style.nodeType !== 9) {\n throw new TypeError(\n \"Failed to execute 'importStylesheet' on 'XSLTProcessor': The node provided is not a Document or Element.\",\n );\n }\n\n // Check for parser errors\n const errorNode = style.querySelector\n ? style.querySelector(\"parsererror\")\n : null;\n if (errorNode) {\n throw new Error(\"XSLT stylesheet contains parse errors\");\n }\n\n this._stylesheet = style;\n this._engine = new XsltEngine();\n\n // Apply any previously set parameters\n for (const [key, value] of this._parameters) {\n this._engine.globalParameters[key] = { value };\n }\n\n this._engine.importStylesheet(style);\n }\n\n /**\n * Transforms the node source by applying the XSLT stylesheet.\n * Returns a document fragment.\n *\n * @param {Node} source - The XML document to transform\n * @param {Document} output - The document that will own the generated fragment\n * @returns {DocumentFragment} The transformed result as a DocumentFragment\n *\n * @example\n * const fragment = processor.transformToFragment(xmlDoc, document);\n * document.getElementById('output').appendChild(fragment);\n */\n transformToFragment(source, output) {\n if (!source) {\n throw new TypeError(\n \"Failed to execute 'transformToFragment' on 'XSLTProcessor': 2 arguments required, but only 0 present.\",\n );\n }\n\n if (!output) {\n throw new TypeError(\n \"Failed to execute 'transformToFragment' on 'XSLTProcessor': 2 arguments required, but only 1 present.\",\n );\n }\n\n if (!this._engine || !this._stylesheet) {\n throw new Error(\n \"Failed to execute 'transformToFragment' on 'XSLTProcessor': No stylesheet has been imported.\",\n );\n }\n\n // Validate source node\n if (\n source.nodeType !== 1 &&\n source.nodeType !== 9 &&\n source.nodeType !== 11\n ) {\n throw new TypeError(\n \"Failed to execute 'transformToFragment' on 'XSLTProcessor': The source is not a valid node type.\",\n );\n }\n\n // Validate output document\n if (output.nodeType !== 9) {\n throw new TypeError(\n \"Failed to execute 'transformToFragment' on 'XSLTProcessor': The output is not a Document.\",\n );\n }\n\n try {\n return this._engine.transform(source, output);\n } catch (error) {\n // Match native behavior - return null on error\n console.error(\"XSLT transformation error:\", error);\n return null;\n }\n }\n\n /**\n * Transforms the node source by applying the XSLT stylesheet.\n * Returns a full XML document.\n *\n * @param {Node} source - The XML document to transform\n * @returns {XMLDocument} The transformed result as an XMLDocument\n *\n * @example\n * const resultDoc = processor.transformToDocument(xmlDoc);\n * const serialized = new XMLSerializer().serializeToString(resultDoc);\n */\n transformToDocument(source) {\n if (!source) {\n throw new TypeError(\n \"Failed to execute 'transformToDocument' on 'XSLTProcessor': 1 argument required, but only 0 present.\",\n );\n }\n\n if (!this._engine || !this._stylesheet) {\n throw new Error(\n \"Failed to execute 'transformToDocument' on 'XSLTProcessor': No stylesheet has been imported.\",\n );\n }\n\n // Validate source node\n if (\n source.nodeType !== 1 &&\n source.nodeType !== 9 &&\n source.nodeType !== 11\n ) {\n throw new TypeError(\n \"Failed to execute 'transformToDocument' on 'XSLTProcessor': The source is not a valid node type.\",\n );\n }\n\n try {\n return this._engine.transformToDocument(source);\n } catch (error) {\n // Match native behavior - return null on error\n console.error(\"XSLT transformation error:\", error);\n return null;\n }\n }\n\n /**\n * Sets a parameter in the XSLT stylesheet.\n *\n * @param {string|null} namespaceURI - The namespace URI of the XSLT parameter (use null for no namespace)\n * @param {string} localName - The local name of the parameter\n * @param {*} value - The value to set (string, number, boolean, or node-set)\n * @returns {void}\n *\n * @example\n * processor.setParameter(null, 'sortOrder', 'ascending');\n * processor.setParameter('http://example.com/ns', 'limit', 10);\n */\n setParameter(namespaceURI, localName, value) {\n if (arguments.length < 3) {\n throw new TypeError(\n `Failed to execute 'setParameter' on 'XSLTProcessor': 3 arguments required, but only ${arguments.length} present.`,\n );\n }\n\n if (typeof localName !== \"string\" || localName === \"\") {\n throw new TypeError(\n \"Failed to execute 'setParameter' on 'XSLTProcessor': The localName argument must be a non-empty string.\",\n );\n }\n\n const key = namespaceURI ? `{${namespaceURI}}${localName}` : localName;\n this._parameters.set(key, value);\n\n // If engine is already initialized, update it\n if (this._engine) {\n this._engine.globalParameters[key] = { value };\n }\n }\n\n /**\n * Gets the value of a parameter from the XSLT stylesheet.\n *\n * @param {string|null} namespaceURI - The namespace URI of the parameter\n * @param {string} localName - The local name of the parameter\n * @returns {*} The parameter value, or empty string if not set\n *\n * @example\n * const sortOrder = processor.getParameter(null, 'sortOrder');\n */\n getParameter(namespaceURI, localName) {\n if (arguments.length < 2) {\n throw new TypeError(\n `Failed to execute 'getParameter' on 'XSLTProcessor': 2 arguments required, but only ${arguments.length} present.`,\n );\n }\n\n if (typeof localName !== \"string\") {\n throw new TypeError(\n \"Failed to execute 'getParameter' on 'XSLTProcessor': The localName argument must be a string.\",\n );\n }\n\n const key = namespaceURI ? `{${namespaceURI}}${localName}` : localName;\n\n if (this._parameters.has(key)) {\n return this._parameters.get(key);\n }\n\n // Return empty string for unset parameters (matches native behavior)\n return \"\";\n }\n\n /**\n * Removes a parameter from the XSLT processor.\n *\n * The XSLTProcessor will use the default value for the parameter\n * as specified in the XSLT stylesheet.\n *\n * @param {string|null} namespaceURI - The namespace URI of the parameter\n * @param {string} localName - The local name of the parameter\n * @returns {void}\n *\n * @example\n * processor.removeParameter(null, 'sortOrder');\n */\n removeParameter(namespaceURI, localName) {\n if (arguments.length < 2) {\n throw new TypeError(\n `Failed to execute 'removeParameter' on 'XSLTProcessor': 2 arguments required, but only ${arguments.length} present.`,\n );\n }\n\n if (typeof localName !== \"string\") {\n throw new TypeError(\n \"Failed to execute 'removeParameter' on 'XSLTProcessor': The localName argument must be a string.\",\n );\n }\n\n const key = namespaceURI ? `{${namespaceURI}}${localName}` : localName;\n this._parameters.delete(key);\n\n if (this._engine) {\n delete this._engine.globalParameters[key];\n }\n }\n\n /**\n * Removes all set parameters from the XSLTProcessor.\n *\n * The processor will use default values specified in the XSLT stylesheet.\n *\n * @returns {void}\n *\n * @example\n * processor.clearParameters();\n */\n clearParameters() {\n this._parameters.clear();\n\n if (this._engine) {\n this._engine.globalParameters = {};\n }\n }\n\n /**\n * Removes all parameters and stylesheets from the XSLTProcessor.\n *\n * @returns {void}\n *\n * @example\n * processor.reset();\n * // Now need to call importStylesheet() again before transforming\n */\n reset() {\n this._engine = null;\n this._stylesheet = null;\n this._parameters.clear();\n }\n}\n\n/**\n * Check if native XSLTProcessor is available and functional\n *\n * @returns {boolean} True if native XSLTProcessor works correctly\n */\nexport function isNativeXSLTSupported() {\n if (typeof globalThis.XSLTProcessor === \"undefined\") {\n return false;\n }\n\n try {\n const processor = new globalThis.XSLTProcessor();\n const parser = new DOMParser();\n\n const xslt = parser.parseFromString(\n `<?xml version=\"1.0\"?>\n <xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n <xsl:template match=\"/\"><test/></xsl:template>\n </xsl:stylesheet>`,\n \"application/xml\",\n );\n\n processor.importStylesheet(xslt);\n\n const xml = parser.parseFromString(\"<root/>\", \"application/xml\");\n const result = processor.transformToFragment(xml, document);\n\n return result !== null && result.childNodes.length > 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Install as global XSLTProcessor replacement if native is not functional\n *\n * @param {boolean} force - Force installation even if native is available\n * @returns {boolean} True if installed as global\n */\nexport function installGlobal(force = false) {\n if (!force && isNativeXSLTSupported()) {\n return false;\n }\n\n globalThis.XSLTProcessor = XSLTProcessor;\n return true;\n}\n\nexport default XSLTProcessor;\n", "/**\n * XPath 1.0 Module\n * Based on W3C XPath 1.0 Specification: http://www.w3.org/TR/1999/REC-xpath-19991116\n */\n\n\"use strict\";\n\nexport { TokenType, Token, XPathTokenizer, tokenize } from \"./tokenizer.js\";\nexport { NodeType, ASTNode, XPathParser, parse } from \"./parser.js\";\nexport {\n XPathResultType,\n XPathContext,\n XPathEvaluator,\n XPathLimits,\n} from \"./evaluator.js\";\n\nimport { parse } from \"./parser.js\";\nimport { XPathEvaluator, XPathContext } from \"./evaluator.js\";\n\n/**\n * Evaluate an XPath expression against a node\n *\n * @param {string} expression - XPath expression\n * @param {Node} contextNode - Context node\n * @param {Object} options - Options (variables, namespaces)\n * @returns {*} Evaluation result\n */\nexport function evaluate(expression, contextNode, options = {}) {\n const ast = parse(expression);\n const evaluator = new XPathEvaluator();\n const context = new XPathContext(\n contextNode,\n 1,\n 1,\n options.variables || {},\n options.namespaces || {},\n );\n return evaluator.evaluate(ast, context);\n}\n\n/**\n * Select nodes matching an XPath expression\n *\n * @param {string} expression - XPath expression\n * @param {Node} contextNode - Context node\n * @param {Object} options - Options\n * @returns {Node[]} Matching nodes\n */\nexport function select(expression, contextNode, options = {}) {\n const result = evaluate(expression, contextNode, options);\n if (Array.isArray(result)) return result;\n if (result && result.nodeType) return [result];\n return [];\n}\n\n/**\n * Select first node matching an XPath expression\n *\n * @param {string} expression - XPath expression\n * @param {Node} contextNode - Context node\n * @param {Object} options - Options\n * @returns {Node|null} First matching node or null\n */\nexport function selectFirst(expression, contextNode, options = {}) {\n const nodes = select(expression, contextNode, options);\n return nodes.length > 0 ? nodes[0] : null;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["ns", "result", "select", "xpathContext", "result", "nodes"]
|
|
3
|
+
"sources": ["../src/index.js", "../src/xpath/tokenizer.js", "../src/xpath/parser.js", "../src/xpath/evaluator.js", "../src/xslt/elements.js", "../src/xslt/formatNumber.js", "../src/xslt/functions.js", "../src/xslt/keys.js", "../src/xslt/number.js", "../src/xslt/numberFormat.js", "../src/xslt/uri.js", "../src/xslt/whitespace.js", "../src/xslt/literalResult.js", "../src/xslt/resultTree.js", "../src/xslt/templatePriority.js", "../src/xslt/serializer/constants.js", "../src/xslt/serializer/settings.js", "../src/xslt/serializer/escape.js", "../src/xslt/serializer/namespaces.js", "../src/xslt/serializer/indent.js", "../src/xslt/serializer/rawText.js", "../src/xslt/serializer/baseWriter.js", "../src/xslt/serializer/xmlSerializer.js", "../src/xslt/serializer/htmlSerializer.js", "../src/xslt/serializer/textSerializer.js", "../src/xslt/serializer.js", "../src/xslt/engine.js", "../src/XSLTProcessor.js", "../src/xpath/index.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * xslt-processor\n *\n * JavaScript implementation of XSLTProcessor for browser environments.\n *\n * This package provides a JavaScript implementation of the W3C XSLTProcessor API\n * that can be used as a drop-in replacement for the native browser implementation.\n *\n * Specifications implemented:\n * - XPath 1.0: http://www.w3.org/TR/1999/REC-xpath-19991116\n * - XSLT 1.0: http://www.w3.org/TR/1999/REC-xslt-19991116\n * - DOM Level 3: http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/\n *\n * @example\n * // ESM import\n * import { XSLTProcessor, installGlobal } from 'xslt-processor';\n *\n * // Install as global replacement\n * installGlobal();\n *\n * // Or use directly\n * const processor = new XSLTProcessor();\n * processor.importStylesheet(xsltDoc);\n * const result = processor.transformToFragment(xmlDoc, document);\n */\n\n// Main XSLTProcessor class\nexport {\n XSLTProcessor,\n isNativeXSLTSupported,\n installGlobal,\n default,\n} from \"./XSLTProcessor.js\";\n\n// XPath module (for advanced users)\nexport {\n evaluate as evaluateXPath,\n select as selectXPath,\n selectFirst as selectFirstXPath,\n XPathEvaluator,\n XPathContext,\n XPathResultType,\n parse as parseXPath,\n} from \"./xpath/index.js\";\n\n// XSLT engine (for advanced users)\nexport { XsltEngine, XsltContext } from \"./xslt/index.js\";\n\n// Output serializer (xsl:output, XSLT 1.0 section 16)\nexport {\n serializeResult,\n markRawText,\n isRawText,\n resolveOutputSettings,\n} from \"./xslt/serializer.js\";\n\n/**\n * Version information\n */\nexport const VERSION = \"1.1.1\";\n\n/**\n * Check if we're running in a browser environment\n */\nexport const isBrowser =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n/**\n * Check if we're running in Node.js\n */\nexport const isNode =\n typeof process !== \"undefined\" && process.versions?.node != null;\n", "/**\n * XPath 1.0 Tokenizer\n * Based on W3C XPath 1.0 Specification: http://www.w3.org/TR/1999/REC-xpath-19991116\n *\n * Converts XPath expression strings into token streams for parsing.\n */\n\n\"use strict\";\n\nexport const TokenType = {\n // Literals\n NUMBER: \"NUMBER\",\n LITERAL: \"LITERAL\",\n\n // Operators\n SLASH: \"SLASH\",\n DOUBLE_SLASH: \"DOUBLE_SLASH\",\n PIPE: \"PIPE\",\n PLUS: \"PLUS\",\n MINUS: \"MINUS\",\n STAR: \"STAR\",\n DIV: \"DIV\",\n MOD: \"MOD\",\n EQUALS: \"EQUALS\",\n NOT_EQUALS: \"NOT_EQUALS\",\n LT: \"LT\",\n LTE: \"LTE\",\n GT: \"GT\",\n GTE: \"GTE\",\n AND: \"AND\",\n OR: \"OR\",\n\n // Brackets\n LPAREN: \"LPAREN\",\n RPAREN: \"RPAREN\",\n LBRACKET: \"LBRACKET\",\n RBRACKET: \"RBRACKET\",\n\n // Axes\n AXIS: \"AXIS\",\n AT: \"AT\",\n DOT: \"DOT\",\n DOUBLE_DOT: \"DOUBLE_DOT\",\n DOUBLE_COLON: \"DOUBLE_COLON\",\n\n // Names\n NAME: \"NAME\",\n NCNAME: \"NCNAME\",\n PREFIX: \"PREFIX\",\n FUNCTION: \"FUNCTION\",\n NODE_TYPE: \"NODE_TYPE\",\n\n // Other\n COMMA: \"COMMA\",\n DOLLAR: \"DOLLAR\",\n COLON: \"COLON\",\n EOF: \"EOF\",\n};\n\nconst AXIS_NAMES = new Set([\n \"ancestor\",\n \"ancestor-or-self\",\n \"attribute\",\n \"child\",\n \"descendant\",\n \"descendant-or-self\",\n \"following\",\n \"following-sibling\",\n \"namespace\",\n \"parent\",\n \"preceding\",\n \"preceding-sibling\",\n \"self\",\n]);\n\nconst NODE_TYPES = new Set([\n \"comment\",\n \"text\",\n \"processing-instruction\",\n \"node\",\n]);\n\nconst OPERATORS = new Set([\"and\", \"or\", \"mod\", \"div\"]);\n\nexport class Token {\n constructor(type, value, position) {\n this.type = type;\n this.value = value;\n this.position = position;\n }\n\n toString() {\n return `Token(${this.type}, ${JSON.stringify(this.value)}, pos=${this.position})`;\n }\n}\n\n// Tokens that indicate the NEXT token should NOT be treated as an OperatorName\n// Per XPath 1.0 spec: \"If there is a preceding token and the preceding token is not one of\n// @, ::, (, [, , or an Operator, then... an NCName must be recognized as an OperatorName.\"\n// So after these tokens, OperatorNames (div, mod, and, or) should be treated as regular names.\nconst OPERATOR_CONTEXT_BLOCKERS = new Set([\n TokenType.AT,\n TokenType.DOUBLE_COLON,\n TokenType.LPAREN,\n TokenType.LBRACKET,\n TokenType.COMMA,\n // Operators - after an operator, next name token should be a name, not an operator\n TokenType.SLASH,\n TokenType.DOUBLE_SLASH,\n TokenType.PIPE,\n TokenType.PLUS,\n TokenType.MINUS,\n TokenType.STAR,\n TokenType.DIV,\n TokenType.MOD,\n TokenType.EQUALS,\n TokenType.NOT_EQUALS,\n TokenType.LT,\n TokenType.LTE,\n TokenType.GT,\n TokenType.GTE,\n TokenType.AND,\n TokenType.OR,\n]);\n\nexport class XPathTokenizer {\n constructor(expression) {\n this.expression = expression;\n this.position = 0;\n this.tokens = [];\n }\n\n /**\n * Get the last token that was added (if any)\n */\n getLastToken() {\n return this.tokens.length > 0 ? this.tokens[this.tokens.length - 1] : null;\n }\n\n /**\n * Check if the current context allows operator names (div, mod, and, or)\n * Per XPath 1.0 spec disambiguation rules.\n */\n isOperatorContext() {\n const lastToken = this.getLastToken();\n // No preceding token means we're at the start - not an operator context\n if (!lastToken) return false;\n // If preceding token is a \"blocker\", it's not an operator context\n if (OPERATOR_CONTEXT_BLOCKERS.has(lastToken.type)) return false;\n // Otherwise, it IS an operator context (after names, numbers, closing brackets, etc.)\n return true;\n }\n\n tokenize() {\n this.tokens = [];\n this.position = 0;\n\n while (this.position < this.expression.length) {\n this.skipWhitespace();\n if (this.position >= this.expression.length) break;\n\n const token = this.nextToken();\n if (token) {\n this.tokens.push(token);\n }\n }\n\n this.tokens.push(new Token(TokenType.EOF, null, this.position));\n return this.tokens;\n }\n\n skipWhitespace() {\n while (\n this.position < this.expression.length &&\n /\\s/.test(this.expression[this.position])\n ) {\n this.position++;\n }\n }\n\n peek(offset = 0) {\n return this.expression[this.position + offset];\n }\n\n consume() {\n return this.expression[this.position++];\n }\n\n nextToken() {\n const startPos = this.position;\n const char = this.peek();\n\n // String literals\n if (char === '\"' || char === \"'\") {\n return this.readStringLiteral();\n }\n\n // Numbers\n if (/[0-9]/.test(char) || (char === \".\" && /[0-9]/.test(this.peek(1)))) {\n return this.readNumber();\n }\n\n // Multi-character operators\n if (char === \"/\" && this.peek(1) === \"/\") {\n this.position += 2;\n return new Token(TokenType.DOUBLE_SLASH, \"//\", startPos);\n }\n\n if (char === \".\" && this.peek(1) === \".\") {\n this.position += 2;\n return new Token(TokenType.DOUBLE_DOT, \"..\", startPos);\n }\n\n if (char === \":\" && this.peek(1) === \":\") {\n this.position += 2;\n return new Token(TokenType.DOUBLE_COLON, \"::\", startPos);\n }\n\n if (char === \"!\" && this.peek(1) === \"=\") {\n this.position += 2;\n return new Token(TokenType.NOT_EQUALS, \"!=\", startPos);\n }\n\n if (char === \"<\" && this.peek(1) === \"=\") {\n this.position += 2;\n return new Token(TokenType.LTE, \"<=\", startPos);\n }\n\n if (char === \">\" && this.peek(1) === \"=\") {\n this.position += 2;\n return new Token(TokenType.GTE, \">=\", startPos);\n }\n\n // Single-character tokens\n const singleCharTokens = {\n \"/\": TokenType.SLASH,\n \"|\": TokenType.PIPE,\n \"+\": TokenType.PLUS,\n \"-\": TokenType.MINUS,\n \"*\": TokenType.STAR,\n \"=\": TokenType.EQUALS,\n \"<\": TokenType.LT,\n \">\": TokenType.GT,\n \"(\": TokenType.LPAREN,\n \")\": TokenType.RPAREN,\n \"[\": TokenType.LBRACKET,\n \"]\": TokenType.RBRACKET,\n \"@\": TokenType.AT,\n \".\": TokenType.DOT,\n \",\": TokenType.COMMA,\n $: TokenType.DOLLAR,\n \":\": TokenType.COLON,\n };\n\n if (singleCharTokens[char]) {\n this.position++;\n return new Token(singleCharTokens[char], char, startPos);\n }\n\n // Names and keywords\n if (this.isNameStartChar(char)) {\n return this.readName();\n }\n\n throw new Error(\n `Unexpected character '${char}' at position ${this.position} in expression: ${this.expression}`,\n );\n }\n\n readStringLiteral() {\n const startPos = this.position;\n const quote = this.consume();\n let value = \"\";\n\n while (this.position < this.expression.length && this.peek() !== quote) {\n value += this.consume();\n }\n\n if (this.position >= this.expression.length) {\n throw new Error(`Unterminated string literal at position ${startPos}`);\n }\n\n this.consume(); // closing quote\n return new Token(TokenType.LITERAL, value, startPos);\n }\n\n readNumber() {\n const startPos = this.position;\n let value = \"\";\n\n // Integer part\n while (\n this.position < this.expression.length &&\n /[0-9]/.test(this.peek())\n ) {\n value += this.consume();\n }\n\n // Decimal part (handles both 1.5 and .5 style numbers)\n // For .5 style: entry condition ensures digit follows, so this branch handles it\n if (this.peek() === \".\" && /[0-9]/.test(this.peek(1))) {\n value += this.consume(); // .\n while (\n this.position < this.expression.length &&\n /[0-9]/.test(this.peek())\n ) {\n value += this.consume();\n }\n }\n\n return new Token(TokenType.NUMBER, parseFloat(value), startPos);\n }\n\n readName() {\n const startPos = this.position;\n let value = \"\";\n\n while (\n this.position < this.expression.length &&\n this.isNameChar(this.peek())\n ) {\n value += this.consume();\n }\n\n // Check for axis name followed by ::\n this.skipWhitespace();\n if (AXIS_NAMES.has(value) && this.peek() === \":\" && this.peek(1) === \":\") {\n return new Token(TokenType.AXIS, value, startPos);\n }\n\n // Check for function call (followed by '(')\n const savedPos = this.position;\n this.skipWhitespace();\n if (this.peek() === \"(\") {\n // Check if it's a node type test\n if (NODE_TYPES.has(value)) {\n return new Token(TokenType.NODE_TYPE, value, startPos);\n }\n return new Token(TokenType.FUNCTION, value, startPos);\n }\n this.position = savedPos;\n\n // Check for operators - only in operator context per XPath 1.0 disambiguation rules\n if (OPERATORS.has(value) && this.isOperatorContext()) {\n const opTokens = {\n and: TokenType.AND,\n or: TokenType.OR,\n mod: TokenType.MOD,\n div: TokenType.DIV,\n };\n return new Token(opTokens[value], value, startPos);\n }\n\n return new Token(TokenType.NAME, value, startPos);\n }\n\n isNameStartChar(char) {\n if (!char) return false;\n const code = char.charCodeAt(0);\n return (\n char === \"_\" ||\n (code >= 65 && code <= 90) || // A-Z\n (code >= 97 && code <= 122) || // a-z\n code >= 0xc0 // Unicode letters\n );\n }\n\n isNameChar(char) {\n if (!char) return false;\n const code = char.charCodeAt(0);\n return (\n this.isNameStartChar(char) ||\n char === \"-\" ||\n char === \".\" ||\n (code >= 48 && code <= 57) // 0-9\n );\n }\n}\n\nexport function tokenize(expression) {\n const tokenizer = new XPathTokenizer(expression);\n return tokenizer.tokenize();\n}\n", "/**\n * XPath 1.0 Parser\n * Based on W3C XPath 1.0 Specification: http://www.w3.org/TR/1999/REC-xpath-19991116\n *\n * Converts token stream into an Abstract Syntax Tree (AST).\n */\n\n\"use strict\";\n\nimport { TokenType, tokenize } from \"./tokenizer.js\";\n\nexport const NodeType = {\n // Expression types\n OR_EXPR: \"OrExpr\",\n AND_EXPR: \"AndExpr\",\n EQUALITY_EXPR: \"EqualityExpr\",\n RELATIONAL_EXPR: \"RelationalExpr\",\n ADDITIVE_EXPR: \"AdditiveExpr\",\n MULTIPLICATIVE_EXPR: \"MultiplicativeExpr\",\n UNARY_EXPR: \"UnaryExpr\",\n UNION_EXPR: \"UnionExpr\",\n\n // Path expressions\n PATH_EXPR: \"PathExpr\",\n LOCATION_PATH: \"LocationPath\",\n STEP: \"Step\",\n PREDICATE: \"Predicate\",\n\n // Primaries\n VARIABLE_REF: \"VariableRef\",\n LITERAL: \"Literal\",\n NUMBER: \"Number\",\n FUNCTION_CALL: \"FunctionCall\",\n\n // Node tests\n NAME_TEST: \"NameTest\",\n NODE_TYPE_TEST: \"NodeTypeTest\",\n PI_TEST: \"ProcessingInstructionTest\",\n};\n\nexport class ASTNode {\n constructor(type, props = {}) {\n this.type = type;\n Object.assign(this, props);\n }\n}\n\nexport class XPathParser {\n constructor(tokens) {\n this.tokens = tokens;\n this.position = 0;\n }\n\n parse() {\n const expr = this.parseExpr();\n if (!this.isAtEnd()) {\n throw new Error(\n `Unexpected token ${this.peek().type} at position ${this.peek().position}`,\n );\n }\n return expr;\n }\n\n // Expr ::= OrExpr\n parseExpr() {\n return this.parseOrExpr();\n }\n\n // OrExpr ::= AndExpr | OrExpr 'or' AndExpr\n parseOrExpr() {\n let left = this.parseAndExpr();\n\n while (this.match(TokenType.OR)) {\n const right = this.parseAndExpr();\n left = new ASTNode(NodeType.OR_EXPR, { left, right });\n }\n\n return left;\n }\n\n // AndExpr ::= EqualityExpr | AndExpr 'and' EqualityExpr\n parseAndExpr() {\n let left = this.parseEqualityExpr();\n\n while (this.match(TokenType.AND)) {\n const right = this.parseEqualityExpr();\n left = new ASTNode(NodeType.AND_EXPR, { left, right });\n }\n\n return left;\n }\n\n // EqualityExpr ::= RelationalExpr | EqualityExpr '=' RelationalExpr | EqualityExpr '!=' RelationalExpr\n parseEqualityExpr() {\n let left = this.parseRelationalExpr();\n\n while (true) {\n if (this.match(TokenType.EQUALS)) {\n const right = this.parseRelationalExpr();\n left = new ASTNode(NodeType.EQUALITY_EXPR, {\n operator: \"=\",\n left,\n right,\n });\n } else if (this.match(TokenType.NOT_EQUALS)) {\n const right = this.parseRelationalExpr();\n left = new ASTNode(NodeType.EQUALITY_EXPR, {\n operator: \"!=\",\n left,\n right,\n });\n } else {\n break;\n }\n }\n\n return left;\n }\n\n // RelationalExpr ::= AdditiveExpr | RelationalExpr '<' AdditiveExpr | ...\n parseRelationalExpr() {\n let left = this.parseAdditiveExpr();\n\n while (true) {\n if (this.match(TokenType.LT)) {\n const right = this.parseAdditiveExpr();\n left = new ASTNode(NodeType.RELATIONAL_EXPR, {\n operator: \"<\",\n left,\n right,\n });\n } else if (this.match(TokenType.LTE)) {\n const right = this.parseAdditiveExpr();\n left = new ASTNode(NodeType.RELATIONAL_EXPR, {\n operator: \"<=\",\n left,\n right,\n });\n } else if (this.match(TokenType.GT)) {\n const right = this.parseAdditiveExpr();\n left = new ASTNode(NodeType.RELATIONAL_EXPR, {\n operator: \">\",\n left,\n right,\n });\n } else if (this.match(TokenType.GTE)) {\n const right = this.parseAdditiveExpr();\n left = new ASTNode(NodeType.RELATIONAL_EXPR, {\n operator: \">=\",\n left,\n right,\n });\n } else {\n break;\n }\n }\n\n return left;\n }\n\n // AdditiveExpr ::= MultiplicativeExpr | AdditiveExpr '+' MultiplicativeExpr | AdditiveExpr '-' MultiplicativeExpr\n parseAdditiveExpr() {\n let left = this.parseMultiplicativeExpr();\n\n while (true) {\n if (this.match(TokenType.PLUS)) {\n const right = this.parseMultiplicativeExpr();\n left = new ASTNode(NodeType.ADDITIVE_EXPR, {\n operator: \"+\",\n left,\n right,\n });\n } else if (this.match(TokenType.MINUS)) {\n const right = this.parseMultiplicativeExpr();\n left = new ASTNode(NodeType.ADDITIVE_EXPR, {\n operator: \"-\",\n left,\n right,\n });\n } else {\n break;\n }\n }\n\n return left;\n }\n\n // MultiplicativeExpr ::= UnaryExpr | MultiplicativeExpr '*' UnaryExpr | ...\n parseMultiplicativeExpr() {\n let left = this.parseUnaryExpr();\n\n while (true) {\n if (this.match(TokenType.STAR)) {\n const right = this.parseUnaryExpr();\n left = new ASTNode(NodeType.MULTIPLICATIVE_EXPR, {\n operator: \"*\",\n left,\n right,\n });\n } else if (this.match(TokenType.DIV)) {\n const right = this.parseUnaryExpr();\n left = new ASTNode(NodeType.MULTIPLICATIVE_EXPR, {\n operator: \"div\",\n left,\n right,\n });\n } else if (this.match(TokenType.MOD)) {\n const right = this.parseUnaryExpr();\n left = new ASTNode(NodeType.MULTIPLICATIVE_EXPR, {\n operator: \"mod\",\n left,\n right,\n });\n } else {\n break;\n }\n }\n\n return left;\n }\n\n // UnaryExpr ::= UnionExpr | '-' UnaryExpr\n parseUnaryExpr() {\n if (this.match(TokenType.MINUS)) {\n const operand = this.parseUnaryExpr();\n return new ASTNode(NodeType.UNARY_EXPR, { operator: \"-\", operand });\n }\n return this.parseUnionExpr();\n }\n\n // UnionExpr ::= PathExpr | UnionExpr '|' PathExpr\n parseUnionExpr() {\n let left = this.parsePathExpr();\n\n while (this.match(TokenType.PIPE)) {\n const right = this.parsePathExpr();\n left = new ASTNode(NodeType.UNION_EXPR, { left, right });\n }\n\n return left;\n }\n\n // PathExpr ::= LocationPath | FilterExpr | FilterExpr '/' RelativeLocationPath | FilterExpr '//' RelativeLocationPath\n parsePathExpr() {\n // Check for absolute location path\n if (this.check(TokenType.SLASH) || this.check(TokenType.DOUBLE_SLASH)) {\n return this.parseLocationPath();\n }\n\n // Check if this looks like a location path starting with step\n if (this.isStepStart()) {\n return this.parseLocationPath();\n }\n\n // Otherwise try to parse as filter expression\n const filter = this.parseFilterExpr();\n\n // Check for path continuation\n if (this.check(TokenType.SLASH) || this.check(TokenType.DOUBLE_SLASH)) {\n const steps = [];\n\n while (\n this.check(TokenType.SLASH) ||\n this.check(TokenType.DOUBLE_SLASH)\n ) {\n const isDescendant = this.match(TokenType.DOUBLE_SLASH);\n if (!isDescendant) this.advance(); // consume /\n\n if (isDescendant) {\n steps.push(\n new ASTNode(NodeType.STEP, {\n axis: \"descendant-or-self\",\n nodeTest: new ASTNode(NodeType.NODE_TYPE_TEST, {\n nodeType: \"node\",\n }),\n predicates: [],\n }),\n );\n }\n\n steps.push(this.parseStep());\n }\n\n return new ASTNode(NodeType.PATH_EXPR, { filter, steps });\n }\n\n return filter;\n }\n\n // LocationPath ::= RelativeLocationPath | AbsoluteLocationPath\n parseLocationPath() {\n let absolute = false;\n const steps = [];\n\n if (this.match(TokenType.DOUBLE_SLASH)) {\n absolute = true;\n // //foo is equivalent to /descendant-or-self::node()/foo\n steps.push(\n new ASTNode(NodeType.STEP, {\n axis: \"descendant-or-self\",\n nodeTest: new ASTNode(NodeType.NODE_TYPE_TEST, { nodeType: \"node\" }),\n predicates: [],\n }),\n );\n if (!this.isAtEnd() && !this.check(TokenType.EOF)) {\n steps.push(this.parseStep());\n }\n } else if (this.match(TokenType.SLASH)) {\n absolute = true;\n if (this.isStepStart()) {\n steps.push(this.parseStep());\n }\n } else {\n steps.push(this.parseStep());\n }\n\n while (this.check(TokenType.SLASH) || this.check(TokenType.DOUBLE_SLASH)) {\n const isDescendant = this.match(TokenType.DOUBLE_SLASH);\n if (!isDescendant) this.advance(); // consume /\n\n if (isDescendant) {\n steps.push(\n new ASTNode(NodeType.STEP, {\n axis: \"descendant-or-self\",\n nodeTest: new ASTNode(NodeType.NODE_TYPE_TEST, {\n nodeType: \"node\",\n }),\n predicates: [],\n }),\n );\n }\n\n steps.push(this.parseStep());\n }\n\n return new ASTNode(NodeType.LOCATION_PATH, { absolute, steps });\n }\n\n // Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep\n parseStep() {\n // Handle abbreviated steps\n if (this.match(TokenType.DOT)) {\n return new ASTNode(NodeType.STEP, {\n axis: \"self\",\n nodeTest: new ASTNode(NodeType.NODE_TYPE_TEST, { nodeType: \"node\" }),\n predicates: [],\n });\n }\n\n if (this.match(TokenType.DOUBLE_DOT)) {\n return new ASTNode(NodeType.STEP, {\n axis: \"parent\",\n nodeTest: new ASTNode(NodeType.NODE_TYPE_TEST, { nodeType: \"node\" }),\n predicates: [],\n });\n }\n\n // Parse axis\n let axis = \"child\"; // default axis\n\n if (this.match(TokenType.AT)) {\n axis = \"attribute\";\n } else if (this.check(TokenType.AXIS)) {\n axis = this.advance().value;\n this.expect(TokenType.DOUBLE_COLON);\n }\n\n // Parse node test\n const nodeTest = this.parseNodeTest();\n\n // Parse predicates\n const predicates = [];\n while (this.check(TokenType.LBRACKET)) {\n predicates.push(this.parsePredicate());\n }\n\n return new ASTNode(NodeType.STEP, { axis, nodeTest, predicates });\n }\n\n // NodeTest ::= NameTest | NodeType '(' ')' | 'processing-instruction' '(' Literal ')'\n parseNodeTest() {\n if (this.check(TokenType.NODE_TYPE)) {\n const nodeType = this.advance().value;\n this.expect(TokenType.LPAREN);\n\n if (\n nodeType === \"processing-instruction\" &&\n this.check(TokenType.LITERAL)\n ) {\n const name = this.advance().value;\n this.expect(TokenType.RPAREN);\n return new ASTNode(NodeType.PI_TEST, { name });\n }\n\n this.expect(TokenType.RPAREN);\n return new ASTNode(NodeType.NODE_TYPE_TEST, { nodeType });\n }\n\n // NameTest\n return this.parseNameTest();\n }\n\n // NameTest ::= '*' | NCName ':' '*' | QName\n parseNameTest() {\n if (this.match(TokenType.STAR)) {\n return new ASTNode(NodeType.NAME_TEST, { name: \"*\", prefix: null });\n }\n\n if (!this.check(TokenType.NAME)) {\n throw new Error(`Expected name at position ${this.peek().position}`);\n }\n\n const name = this.advance().value;\n\n // Check for prefix:*\n if (this.match(TokenType.COLON)) {\n if (this.match(TokenType.STAR)) {\n return new ASTNode(NodeType.NAME_TEST, { name: \"*\", prefix: name });\n }\n\n if (this.check(TokenType.NAME)) {\n const localName = this.advance().value;\n return new ASTNode(NodeType.NAME_TEST, {\n name: localName,\n prefix: name,\n });\n }\n\n throw new Error(\n `Expected name or * after : at position ${this.peek().position}`,\n );\n }\n\n return new ASTNode(NodeType.NAME_TEST, { name, prefix: null });\n }\n\n // Predicate ::= '[' Expr ']'\n parsePredicate() {\n this.expect(TokenType.LBRACKET);\n const expr = this.parseExpr();\n this.expect(TokenType.RBRACKET);\n return new ASTNode(NodeType.PREDICATE, { expr });\n }\n\n // FilterExpr ::= PrimaryExpr | FilterExpr Predicate\n parseFilterExpr() {\n let primary = this.parsePrimaryExpr();\n\n while (this.check(TokenType.LBRACKET)) {\n const predicate = this.parsePredicate();\n primary = new ASTNode(NodeType.PATH_EXPR, {\n filter: primary,\n predicates: [predicate],\n });\n }\n\n return primary;\n }\n\n // PrimaryExpr ::= VariableReference | '(' Expr ')' | Literal | Number | FunctionCall\n parsePrimaryExpr() {\n // Variable reference\n if (this.match(TokenType.DOLLAR)) {\n if (!this.check(TokenType.NAME)) {\n throw new Error(\n `Expected variable name at position ${this.peek().position}`,\n );\n }\n const name = this.advance().value;\n let prefix = null;\n\n if (this.match(TokenType.COLON)) {\n prefix = name;\n if (!this.check(TokenType.NAME)) {\n throw new Error(\n `Expected local name at position ${this.peek().position}`,\n );\n }\n const localName = this.advance().value;\n return new ASTNode(NodeType.VARIABLE_REF, { name: localName, prefix });\n }\n\n return new ASTNode(NodeType.VARIABLE_REF, { name, prefix });\n }\n\n // Parenthesized expression\n if (this.match(TokenType.LPAREN)) {\n const expr = this.parseExpr();\n this.expect(TokenType.RPAREN);\n return expr;\n }\n\n // Literal\n if (this.check(TokenType.LITERAL)) {\n return new ASTNode(NodeType.LITERAL, { value: this.advance().value });\n }\n\n // Number\n if (this.check(TokenType.NUMBER)) {\n return new ASTNode(NodeType.NUMBER, { value: this.advance().value });\n }\n\n // Function call\n if (this.check(TokenType.FUNCTION)) {\n return this.parseFunctionCall();\n }\n\n throw new Error(\n `Unexpected token ${this.peek().type} at position ${this.peek().position}`,\n );\n }\n\n // FunctionCall ::= FunctionName '(' ( Argument ( ',' Argument )* )? ')'\n // Note: Prefixed function calls (prefix:fn()) are not supported because\n // the tokenizer identifies functions by NAME followed by '(' - prefixed\n // names like 'fn:name()' are tokenized as NAME:NAME() which is parsed\n // as a location path, not a function call.\n parseFunctionCall() {\n const name = this.advance().value;\n return this.parseFunctionCallArgs(name, null);\n }\n\n parseFunctionCallArgs(name, prefix) {\n this.expect(TokenType.LPAREN);\n\n const args = [];\n if (!this.check(TokenType.RPAREN)) {\n args.push(this.parseExpr());\n while (this.match(TokenType.COMMA)) {\n args.push(this.parseExpr());\n }\n }\n\n this.expect(TokenType.RPAREN);\n\n return new ASTNode(NodeType.FUNCTION_CALL, { name, prefix, args });\n }\n\n // Helper methods\n isStepStart() {\n const type = this.peek().type;\n return (\n type === TokenType.NAME ||\n type === TokenType.STAR ||\n type === TokenType.AT ||\n type === TokenType.DOT ||\n type === TokenType.DOUBLE_DOT ||\n type === TokenType.AXIS ||\n type === TokenType.NODE_TYPE\n );\n }\n\n peek() {\n return this.tokens[this.position];\n }\n\n advance() {\n if (!this.isAtEnd()) {\n return this.tokens[this.position++];\n }\n return this.tokens[this.position];\n }\n\n check(type) {\n if (this.isAtEnd()) return false;\n return this.peek().type === type;\n }\n\n match(type) {\n if (this.check(type)) {\n this.advance();\n return true;\n }\n return false;\n }\n\n expect(type) {\n if (!this.check(type)) {\n throw new Error(\n `Expected ${type} but got ${this.peek().type} at position ${this.peek().position}`,\n );\n }\n return this.advance();\n }\n\n isAtEnd() {\n return this.peek().type === TokenType.EOF;\n }\n}\n\nexport function parse(expression) {\n const tokens = tokenize(expression);\n const parser = new XPathParser(tokens);\n return parser.parse();\n}\n", "/**\n * XPath 1.0 Evaluator\n * Based on W3C XPath 1.0 Specification: http://www.w3.org/TR/1999/REC-xpath-19991116\n *\n * Evaluates XPath AST against DOM nodes.\n */\n\n\"use strict\";\n\nimport { NodeType } from \"./parser.js\";\n\n/**\n * XPath result types matching W3C spec\n */\nexport const XPathResultType = {\n ANY_TYPE: 0,\n NUMBER_TYPE: 1,\n STRING_TYPE: 2,\n BOOLEAN_TYPE: 3,\n UNORDERED_NODE_ITERATOR_TYPE: 4,\n ORDERED_NODE_ITERATOR_TYPE: 5,\n UNORDERED_NODE_SNAPSHOT_TYPE: 6,\n ORDERED_NODE_SNAPSHOT_TYPE: 7,\n ANY_UNORDERED_NODE_TYPE: 8,\n FIRST_ORDERED_NODE_TYPE: 9,\n};\n\n/**\n * Security limits to prevent DoS attacks\n */\nexport const XPathLimits = {\n MAX_RECURSION_DEPTH: 100,\n MAX_RESULT_SIZE: 10000,\n MAX_STRING_LENGTH: 1000000,\n};\n\n/**\n * Forbidden variable names to prevent prototype pollution\n */\nconst FORBIDDEN_VARIABLE_NAMES = Object.freeze([\n \"__proto__\",\n \"constructor\",\n \"prototype\",\n \"__defineGetter__\",\n \"__defineSetter__\",\n \"__lookupGetter__\",\n \"__lookupSetter__\",\n]);\n\n/**\n * XPath evaluation context\n */\nexport class XPathContext {\n /**\n * @param {Node} node - The context node\n * @param {number} [position] - The context position (1-based)\n * @param {number} [size] - The context size\n * @param {Object} [variables] - Variable bindings by name\n * @param {Object} [namespaces] - Namespace bindings by prefix\n * @param {*} [hostContext] - Opaque context of the host language (XSLT),\n * carried through unchanged so host defined functions can reach it\n */\n constructor(\n node,\n position = 1,\n size = 1,\n variables = {},\n namespaces = {},\n hostContext = null,\n ) {\n this.node = node;\n this.position = position;\n this.size = size;\n this.variables = variables;\n this.namespaces = namespaces;\n this.hostContext = hostContext;\n }\n\n clone(overrides = {}) {\n return new XPathContext(\n overrides.node ?? this.node,\n overrides.position ?? this.position,\n overrides.size ?? this.size,\n overrides.variables ?? this.variables,\n overrides.namespaces ?? this.namespaces,\n overrides.hostContext ?? this.hostContext,\n );\n }\n}\n\n/**\n * XPath Evaluator\n */\nexport class XPathEvaluator {\n constructor(options = {}) {\n this.functions = Object.assign(\n Object.create(null),\n this.initCoreFunctions(),\n );\n this.maxRecursionDepth =\n options.maxRecursionDepth ?? XPathLimits.MAX_RECURSION_DEPTH;\n this.maxResultSize = options.maxResultSize ?? XPathLimits.MAX_RESULT_SIZE;\n this.maxStringLength =\n options.maxStringLength ?? XPathLimits.MAX_STRING_LENGTH;\n this.recursionDepth = 0;\n }\n\n /**\n * Evaluate XPath expression against a context\n * @throws {Error} If recursion depth exceeds limit\n * @throws {Error} If AST is invalid\n */\n evaluate(ast, context) {\n if (!ast || typeof ast !== \"object\") {\n throw new Error(\"Invalid AST: expected object\");\n }\n\n if (!ast.type) {\n throw new Error(\"Invalid AST: missing type property\");\n }\n\n this.recursionDepth++;\n if (this.recursionDepth > this.maxRecursionDepth) {\n this.recursionDepth = 0;\n throw new Error(\n `Maximum recursion depth exceeded (${this.maxRecursionDepth})`,\n );\n }\n\n try {\n return this.evaluateInternal(ast, context);\n } finally {\n this.recursionDepth--;\n }\n }\n\n /**\n * Internal evaluation (after validation)\n */\n evaluateInternal(ast, context) {\n switch (ast.type) {\n case NodeType.OR_EXPR:\n return this.evalOrExpr(ast, context);\n case NodeType.AND_EXPR:\n return this.evalAndExpr(ast, context);\n case NodeType.EQUALITY_EXPR:\n return this.evalEqualityExpr(ast, context);\n case NodeType.RELATIONAL_EXPR:\n return this.evalRelationalExpr(ast, context);\n case NodeType.ADDITIVE_EXPR:\n return this.evalAdditiveExpr(ast, context);\n case NodeType.MULTIPLICATIVE_EXPR:\n return this.evalMultiplicativeExpr(ast, context);\n case NodeType.UNARY_EXPR:\n return this.evalUnaryExpr(ast, context);\n case NodeType.UNION_EXPR:\n return this.evalUnionExpr(ast, context);\n case NodeType.PATH_EXPR:\n return this.evalPathExpr(ast, context);\n case NodeType.LOCATION_PATH:\n return this.evalLocationPath(ast, context);\n case NodeType.VARIABLE_REF:\n return this.evalVariableRef(ast, context);\n case NodeType.LITERAL:\n return this.validateString(ast.value);\n case NodeType.NUMBER:\n return ast.value;\n case NodeType.FUNCTION_CALL:\n return this.evalFunctionCall(ast, context);\n default:\n throw new Error(`Unknown AST node type: ${String(ast.type)}`);\n }\n }\n\n /**\n * Validate and limit string length\n */\n validateString(str) {\n if (typeof str === \"string\" && str.length > this.maxStringLength) {\n throw new Error(\n `String exceeds maximum length (${this.maxStringLength})`,\n );\n }\n return str;\n }\n\n /**\n * Validate result size\n */\n validateResultSize(nodes) {\n if (Array.isArray(nodes) && nodes.length > this.maxResultSize) {\n throw new Error(\n `Result set exceeds maximum size (${this.maxResultSize})`,\n );\n }\n return nodes;\n }\n\n evalOrExpr(ast, context) {\n return (\n this.toBoolean(this.evaluate(ast.left, context)) ||\n this.toBoolean(this.evaluate(ast.right, context))\n );\n }\n\n evalAndExpr(ast, context) {\n return (\n this.toBoolean(this.evaluate(ast.left, context)) &&\n this.toBoolean(this.evaluate(ast.right, context))\n );\n }\n\n evalEqualityExpr(ast, context) {\n const left = this.evaluate(ast.left, context);\n const right = this.evaluate(ast.right, context);\n const isEqual = this.compareValues(left, right, \"=\");\n return ast.operator === \"=\" ? isEqual : !isEqual;\n }\n\n evalRelationalExpr(ast, context) {\n const left = this.evaluate(ast.left, context);\n const right = this.evaluate(ast.right, context);\n return this.compareValues(left, right, ast.operator);\n }\n\n evalAdditiveExpr(ast, context) {\n const left = this.toNumber(this.evaluate(ast.left, context));\n const right = this.toNumber(this.evaluate(ast.right, context));\n return ast.operator === \"+\" ? left + right : left - right;\n }\n\n evalMultiplicativeExpr(ast, context) {\n const left = this.toNumber(this.evaluate(ast.left, context));\n const right = this.toNumber(this.evaluate(ast.right, context));\n\n switch (ast.operator) {\n case \"*\":\n return left * right;\n case \"div\":\n return left / right;\n case \"mod\":\n return left % right;\n default:\n throw new Error(`Unknown multiplicative operator: ${ast.operator}`);\n }\n }\n\n evalUnaryExpr(ast, context) {\n const value = this.toNumber(this.evaluate(ast.operand, context));\n return -value;\n }\n\n evalUnionExpr(ast, context) {\n const left = this.evaluate(ast.left, context);\n const right = this.evaluate(ast.right, context);\n\n const leftNodes = Array.isArray(left) ? left : [left];\n const rightNodes = Array.isArray(right) ? right : [right];\n\n // Union in document order, no duplicates\n const seen = new Set();\n const result = [];\n\n for (const node of [...leftNodes, ...rightNodes]) {\n if (!seen.has(node)) {\n seen.add(node);\n result.push(node);\n }\n }\n\n this.validateResultSize(result);\n return this.sortByDocumentOrder(result);\n }\n\n evalPathExpr(ast, context) {\n if (ast.filter) {\n let result = this.evaluate(ast.filter, context);\n\n if (ast.predicates) {\n for (const pred of ast.predicates) {\n result = this.filterByPredicate(result, pred, context);\n }\n }\n\n if (ast.steps) {\n for (const step of ast.steps) {\n result = this.evalStepOnNodes(step, result, context);\n }\n }\n\n return result;\n }\n\n return [];\n }\n\n evalLocationPath(ast, context) {\n let nodes;\n\n if (ast.absolute) {\n // Start from document root node (not document element)\n // XPath absolute paths start from the document node\n const doc = context.node.ownerDocument || context.node;\n nodes = [doc];\n } else {\n nodes = [context.node];\n }\n\n for (const step of ast.steps) {\n nodes = this.evalStepOnNodes(step, nodes, context);\n this.validateResultSize(nodes);\n }\n\n return nodes;\n }\n\n evalStepOnNodes(step, nodes, context) {\n const allNodes = Array.isArray(nodes) ? nodes : [nodes];\n let result = [];\n\n for (const node of allNodes) {\n const stepNodes = this.evalStep(step, context.clone({ node }));\n result = result.concat(stepNodes);\n\n // Early validation to prevent excessive memory use\n if (result.length > this.maxResultSize * 2) {\n this.validateResultSize(result);\n }\n }\n\n // Remove duplicates and sort by document order\n const uniqueResult = [...new Set(result)];\n this.validateResultSize(uniqueResult);\n return this.sortByDocumentOrder(uniqueResult);\n }\n\n evalStep(step, context) {\n // Get nodes along axis\n let nodes = this.getAxisNodes(step.axis, context.node);\n\n // Filter by node test\n nodes = nodes.filter((n) => this.matchNodeTest(step.nodeTest, n, context));\n\n // Apply predicates\n for (const predicate of step.predicates) {\n nodes = this.filterByPredicate(nodes, predicate, context);\n }\n\n return nodes;\n }\n\n getAxisNodes(axis, node) {\n switch (axis) {\n case \"child\":\n return Array.from(node.childNodes || []);\n\n case \"parent\":\n return node.parentNode ? [node.parentNode] : [];\n\n case \"self\":\n return [node];\n\n case \"descendant\":\n return this.getDescendants(node, false);\n\n case \"descendant-or-self\":\n return this.getDescendants(node, true);\n\n case \"ancestor\":\n return this.getAncestors(node, false);\n\n case \"ancestor-or-self\":\n return this.getAncestors(node, true);\n\n case \"following-sibling\":\n return this.getFollowingSiblings(node);\n\n case \"preceding-sibling\":\n return this.getPrecedingSiblings(node);\n\n case \"following\":\n return this.getFollowing(node);\n\n case \"preceding\":\n return this.getPreceding(node);\n\n case \"attribute\":\n if (node.attributes) {\n return Array.from(node.attributes);\n }\n return [];\n\n case \"namespace\":\n // Namespace axis - not commonly used\n return [];\n\n default:\n throw new Error(`Unknown axis: ${axis}`);\n }\n }\n\n getDescendants(node, includeSelf) {\n const result = includeSelf ? [node] : [];\n const stack = Array.from(node.childNodes || []).reverse();\n\n while (stack.length > 0) {\n const current = stack.pop();\n result.push(current);\n if (current.childNodes) {\n for (let i = current.childNodes.length - 1; i >= 0; i--) {\n stack.push(current.childNodes[i]);\n }\n }\n }\n\n return result;\n }\n\n getAncestors(node, includeSelf) {\n const result = includeSelf ? [node] : [];\n let current = node.parentNode;\n\n while (current) {\n result.push(current);\n current = current.parentNode;\n }\n\n return result;\n }\n\n getFollowingSiblings(node) {\n const result = [];\n if (!node) return result;\n let current = node.nextSibling;\n\n while (current) {\n result.push(current);\n current = current.nextSibling;\n }\n\n return result;\n }\n\n getPrecedingSiblings(node) {\n const result = [];\n if (!node) return result;\n let current = node.previousSibling;\n\n while (current) {\n result.push(current);\n current = current.previousSibling;\n }\n\n return result.reverse();\n }\n\n getFollowing(node) {\n const result = [];\n let current = node;\n\n // Go to next sibling, or ancestor's next sibling\n while (current) {\n if (current.nextSibling) {\n current = current.nextSibling;\n result.push(current);\n // Add all descendants\n result.push(...this.getDescendants(current, false));\n } else {\n current = current.parentNode;\n }\n }\n\n return result;\n }\n\n getPreceding(node) {\n const result = [];\n let current = node;\n\n while (current) {\n if (current.previousSibling) {\n current = current.previousSibling;\n // Add descendants in reverse order, then the node\n const descendants = this.getDescendants(current, false);\n result.unshift(...descendants.reverse());\n result.unshift(current);\n } else {\n current = current.parentNode;\n if (current && current.nodeType !== 9) {\n // Not document\n // Don't add ancestors\n }\n }\n }\n\n return result;\n }\n\n matchNodeTest(nodeTest, node, context) {\n switch (nodeTest.type) {\n case NodeType.NAME_TEST:\n return this.matchNameTest(nodeTest, node, context);\n\n case NodeType.NODE_TYPE_TEST:\n return this.matchNodeTypeTest(nodeTest.nodeType, node);\n\n case NodeType.PI_TEST:\n return node.nodeType === 7 && node.nodeName === nodeTest.name;\n\n default:\n return false;\n }\n }\n\n matchNameTest(nodeTest, node, context) {\n // Only element and attribute nodes have names\n if (node.nodeType !== 1 && node.nodeType !== 2) {\n return false;\n }\n\n const name = nodeTest.name;\n const prefix = nodeTest.prefix;\n\n // Wildcard\n if (name === \"*\" && !prefix) {\n return true;\n }\n\n // Get node's local name and namespace\n const nodeName = node.localName || node.nodeName;\n const nodeNs = node.namespaceURI || null;\n\n // Prefix:* matches all nodes in namespace\n if (name === \"*\" && prefix) {\n const ns = context.namespaces[prefix];\n return nodeNs === ns;\n }\n\n // Simple name match\n if (!prefix) {\n // For elements, match local name (case-insensitive for HTML)\n const doc = node.ownerDocument;\n if (doc && doc.contentType === \"text/html\" && node.nodeType === 1) {\n return nodeName.toLowerCase() === name.toLowerCase();\n }\n return nodeName === name;\n }\n\n // Prefixed name match\n const ns = context.namespaces[prefix];\n return nodeName === name && nodeNs === ns;\n }\n\n matchNodeTypeTest(nodeType, node) {\n switch (nodeType) {\n case \"node\":\n return true;\n case \"text\":\n // The XPath data model has no CDATA sections: they are text nodes\n return node.nodeType === 3 || node.nodeType === 4;\n case \"comment\":\n return node.nodeType === 8;\n case \"processing-instruction\":\n return node.nodeType === 7;\n default:\n return false;\n }\n }\n\n filterByPredicate(nodes, predicate, context) {\n const result = [];\n const nodeArray = Array.isArray(nodes) ? nodes : [nodes];\n const size = nodeArray.length;\n\n for (let i = 0; i < nodeArray.length; i++) {\n const node = nodeArray[i];\n const predicateContext = context.clone({\n node,\n position: i + 1,\n size,\n });\n\n const value = this.evaluate(predicate.expr, predicateContext);\n\n // If predicate evaluates to a number, it's a position test\n if (typeof value === \"number\") {\n if (value === i + 1) {\n result.push(node);\n }\n } else if (this.toBoolean(value)) {\n result.push(node);\n }\n }\n\n return result;\n }\n\n evalVariableRef(ast, context) {\n const name = ast.prefix ? `${ast.prefix}:${ast.name}` : ast.name;\n\n // Security: Prevent prototype pollution\n if (\n FORBIDDEN_VARIABLE_NAMES.includes(name) ||\n FORBIDDEN_VARIABLE_NAMES.includes(ast.name)\n ) {\n throw new Error(`Forbidden variable name: $${name}`);\n }\n\n if (!Object.prototype.hasOwnProperty.call(context.variables, name)) {\n throw new Error(`Undefined variable: $${name}`);\n }\n return context.variables[name];\n }\n\n /**\n * Register additional functions, for example the XSLT function library.\n *\n * Existing names are overwritten, so a host language can also specialise a\n * core function. Each function is called as `fn(args, context)` with the\n * evaluator as `this`.\n *\n * @param {Object<string, Function>} functions - Functions by name\n * @returns {XPathEvaluator} This evaluator, to allow chaining\n *\n * @example\n * evaluator.registerFunctions({ 'my:double': (args, ctx) => 2 });\n */\n registerFunctions(functions) {\n for (const [name, fn] of Object.entries(functions)) {\n this.functions[name] = fn;\n }\n return this;\n }\n\n evalFunctionCall(ast, context) {\n const name = ast.prefix ? `${ast.prefix}:${ast.name}` : ast.name;\n\n if (!Object.hasOwn(this.functions, name)) {\n throw new Error(`Unknown function: ${name}`);\n }\n\n return this.functions[name].call(this, ast.args, context);\n }\n\n // Type conversion functions\n toBoolean(value) {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0 && !isNaN(value);\n if (typeof value === \"string\") return value.length > 0;\n if (Array.isArray(value)) return value.length > 0;\n if (value && value.nodeType) return true;\n return Boolean(value);\n }\n\n toNumber(value) {\n if (typeof value === \"number\") return value;\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed === \"\") return NaN;\n const num = Number(trimmed);\n return num;\n }\n if (Array.isArray(value)) {\n return this.toNumber(this.toString(value));\n }\n if (value && value.nodeType) {\n return this.toNumber(this.getStringValue(value));\n }\n return NaN;\n }\n\n toString(value) {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") {\n if (isNaN(value)) return \"NaN\";\n if (value === Infinity) return \"Infinity\";\n if (value === -Infinity) return \"-Infinity\";\n if (value === 0) return \"0\";\n return String(value);\n }\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n if (Array.isArray(value)) {\n if (value.length === 0) return \"\";\n return this.getStringValue(value[0]);\n }\n if (value && value.nodeType) {\n return this.getStringValue(value);\n }\n return String(value);\n }\n\n getStringValue(node) {\n if (!node) return \"\";\n\n switch (node.nodeType) {\n case 1: // Element\n case 9: // Document\n case 11: {\n // Document Fragment\n let text = \"\";\n const walker = (n) => {\n if (n.nodeType === 3 || n.nodeType === 4) {\n text += n.nodeValue || \"\";\n } else if (n.childNodes) {\n for (const child of n.childNodes) {\n walker(child);\n }\n }\n };\n walker(node);\n return text;\n }\n\n case 2: // Attribute\n case 3: // Text\n case 4: // CDATA\n case 7: // Processing Instruction\n case 8: // Comment\n return node.nodeValue || \"\";\n\n default:\n return \"\";\n }\n }\n\n // Comparison helper\n compareValues(left, right, operator) {\n const leftIsNodeSet = Array.isArray(left);\n const rightIsNodeSet = Array.isArray(right);\n\n // Node-set comparisons\n if (leftIsNodeSet && rightIsNodeSet) {\n for (const l of left) {\n for (const r of right) {\n if (\n this.comparePrimitive(\n this.getStringValue(l),\n this.getStringValue(r),\n operator,\n )\n ) {\n return true;\n }\n }\n }\n return false;\n }\n\n if (leftIsNodeSet) {\n for (const l of left) {\n if (this.comparePrimitive(this.getStringValue(l), right, operator)) {\n return true;\n }\n }\n return false;\n }\n\n if (rightIsNodeSet) {\n for (const r of right) {\n if (this.comparePrimitive(left, this.getStringValue(r), operator)) {\n return true;\n }\n }\n return false;\n }\n\n return this.comparePrimitive(left, right, operator);\n }\n\n comparePrimitive(left, right, operator) {\n // If comparing for equality with different types\n if (operator === \"=\" || operator === \"!=\") {\n // If one is boolean, convert both to boolean\n if (typeof left === \"boolean\" || typeof right === \"boolean\") {\n const result = this.toBoolean(left) === this.toBoolean(right);\n return operator === \"=\" ? result : !result;\n }\n // If one is number, convert both to number\n if (typeof left === \"number\" || typeof right === \"number\") {\n const result = this.toNumber(left) === this.toNumber(right);\n return operator === \"=\" ? result : !result;\n }\n // Otherwise compare as strings\n const result = this.toString(left) === this.toString(right);\n return operator === \"=\" ? result : !result;\n }\n\n // Relational operators always compare as numbers\n const leftNum = this.toNumber(left);\n const rightNum = this.toNumber(right);\n\n switch (operator) {\n case \"<\":\n return leftNum < rightNum;\n case \"<=\":\n return leftNum <= rightNum;\n case \">\":\n return leftNum > rightNum;\n case \">=\":\n return leftNum >= rightNum;\n default:\n throw new Error(`Unknown comparison operator: ${operator}`);\n }\n }\n\n sortByDocumentOrder(nodes) {\n if (nodes.length <= 1) return nodes;\n\n return nodes.sort((a, b) => {\n if (a === b) return 0;\n\n const position = a.compareDocumentPosition\n ? a.compareDocumentPosition(b)\n : this.compareDocumentPositionFallback(a, b);\n\n if (position & 4) return -1; // a before b\n if (position & 2) return 1; // a after b\n return 0;\n });\n }\n\n compareDocumentPositionFallback(a, b) {\n // Simple fallback for environments without compareDocumentPosition\n const getPath = (node) => {\n const path = [];\n let current = node;\n while (current) {\n if (current.parentNode) {\n const siblings = Array.from(current.parentNode.childNodes);\n path.unshift(siblings.indexOf(current));\n }\n current = current.parentNode;\n }\n return path;\n };\n\n const pathA = getPath(a);\n const pathB = getPath(b);\n\n for (let i = 0; i < Math.min(pathA.length, pathB.length); i++) {\n if (pathA[i] < pathB[i]) return 4; // a before b\n if (pathA[i] > pathB[i]) return 2; // a after b\n }\n\n return pathA.length < pathB.length ? 4 : 2;\n }\n\n /**\n * Initialize XPath 1.0 core functions\n */\n initCoreFunctions() {\n return {\n // Node set functions\n last: (args, ctx) => ctx.size,\n position: (args, ctx) => ctx.position,\n count: (args, ctx) => {\n const nodeSet = this.evaluate(args[0], ctx);\n return Array.isArray(nodeSet) ? nodeSet.length : 1;\n },\n id: (args, ctx) => {\n const value = this.toString(this.evaluate(args[0], ctx));\n const doc = ctx.node.ownerDocument || ctx.node;\n const ids = value.split(/\\s+/).filter((id) => id);\n const result = [];\n for (const id of ids) {\n const el = doc.getElementById(id);\n if (el) result.push(el);\n }\n return result;\n },\n \"local-name\": (args, ctx) => {\n let node;\n if (args.length === 0) {\n node = ctx.node;\n } else {\n const nodeSet = this.evaluate(args[0], ctx);\n node = Array.isArray(nodeSet) ? nodeSet[0] : nodeSet;\n }\n if (!node) return \"\";\n return node.localName || node.nodeName || \"\";\n },\n \"namespace-uri\": (args, ctx) => {\n let node;\n if (args.length === 0) {\n node = ctx.node;\n } else {\n const nodeSet = this.evaluate(args[0], ctx);\n node = Array.isArray(nodeSet) ? nodeSet[0] : nodeSet;\n }\n if (!node) return \"\";\n return node.namespaceURI || \"\";\n },\n name: (args, ctx) => {\n let node;\n if (args.length === 0) {\n node = ctx.node;\n } else {\n const nodeSet = this.evaluate(args[0], ctx);\n node = Array.isArray(nodeSet) ? nodeSet[0] : nodeSet;\n }\n if (!node) return \"\";\n return node.nodeName || \"\";\n },\n\n // String functions\n string: (args, ctx) => {\n if (args.length === 0) {\n return this.toString([ctx.node]);\n }\n return this.toString(this.evaluate(args[0], ctx));\n },\n concat: (args, ctx) => {\n return args\n .map((arg) => this.toString(this.evaluate(arg, ctx)))\n .join(\"\");\n },\n \"starts-with\": (args, ctx) => {\n const str = this.toString(this.evaluate(args[0], ctx));\n const prefix = this.toString(this.evaluate(args[1], ctx));\n return str.startsWith(prefix);\n },\n contains: (args, ctx) => {\n const str = this.toString(this.evaluate(args[0], ctx));\n const substr = this.toString(this.evaluate(args[1], ctx));\n return str.includes(substr);\n },\n \"substring-before\": (args, ctx) => {\n const str = this.toString(this.evaluate(args[0], ctx));\n const substr = this.toString(this.evaluate(args[1], ctx));\n const idx = str.indexOf(substr);\n return idx === -1 ? \"\" : str.substring(0, idx);\n },\n \"substring-after\": (args, ctx) => {\n const str = this.toString(this.evaluate(args[0], ctx));\n const substr = this.toString(this.evaluate(args[1], ctx));\n const idx = str.indexOf(substr);\n return idx === -1 ? \"\" : str.substring(idx + substr.length);\n },\n substring: (args, ctx) => {\n const str = this.toString(this.evaluate(args[0], ctx));\n let start = Math.round(this.toNumber(this.evaluate(args[1], ctx)));\n let length;\n\n if (args.length > 2) {\n length = Math.round(this.toNumber(this.evaluate(args[2], ctx)));\n }\n\n // XPath uses 1-based indexing\n start = start - 1;\n\n if (isNaN(start)) return \"\";\n if (start < 0) {\n if (length !== undefined) {\n length = length + start;\n }\n start = 0;\n }\n\n if (length !== undefined) {\n if (isNaN(length) || length <= 0) return \"\";\n return str.substring(start, start + length);\n }\n\n return str.substring(start);\n },\n \"string-length\": (args, ctx) => {\n const str =\n args.length === 0\n ? this.toString([ctx.node])\n : this.toString(this.evaluate(args[0], ctx));\n return str.length;\n },\n \"normalize-space\": (args, ctx) => {\n const str =\n args.length === 0\n ? this.toString([ctx.node])\n : this.toString(this.evaluate(args[0], ctx));\n return str.trim().replace(/\\s+/g, \" \");\n },\n translate: (args, ctx) => {\n const str = this.toString(this.evaluate(args[0], ctx));\n const from = this.toString(this.evaluate(args[1], ctx));\n const to = this.toString(this.evaluate(args[2], ctx));\n\n let result = \"\";\n for (const char of str) {\n const idx = from.indexOf(char);\n if (idx === -1) {\n result += char;\n } else if (idx < to.length) {\n result += to[idx];\n }\n // If idx >= to.length, character is removed\n }\n return result;\n },\n\n // Boolean functions\n boolean: (args, ctx) => {\n return this.toBoolean(this.evaluate(args[0], ctx));\n },\n not: (args, ctx) => {\n return !this.toBoolean(this.evaluate(args[0], ctx));\n },\n true: () => true,\n false: () => false,\n lang: (args, ctx) => {\n const lang = this.toString(this.evaluate(args[0], ctx)).toLowerCase();\n let node = ctx.node;\n\n while (node && node.nodeType === 1) {\n const xmlLang =\n node.getAttribute(\"xml:lang\") || node.getAttribute(\"lang\");\n if (xmlLang) {\n const nodeLang = xmlLang.toLowerCase();\n return nodeLang === lang || nodeLang.startsWith(lang + \"-\");\n }\n node = node.parentNode;\n }\n return false;\n },\n\n // Number functions\n number: (args, ctx) => {\n if (args.length === 0) {\n return this.toNumber([ctx.node]);\n }\n return this.toNumber(this.evaluate(args[0], ctx));\n },\n sum: (args, ctx) => {\n const nodeSet = this.evaluate(args[0], ctx);\n if (!Array.isArray(nodeSet)) return NaN;\n return nodeSet.reduce(\n (sum, node) => sum + this.toNumber(this.getStringValue(node)),\n 0,\n );\n },\n floor: (args, ctx) => {\n return Math.floor(this.toNumber(this.evaluate(args[0], ctx)));\n },\n ceiling: (args, ctx) => {\n return Math.ceil(this.toNumber(this.evaluate(args[0], ctx)));\n },\n round: (args, ctx) => {\n const num = this.toNumber(this.evaluate(args[0], ctx));\n if (isNaN(num)) return NaN;\n if (num === -0.5) return -0;\n return Math.round(num);\n },\n };\n }\n}\n", "/**\n * XSLT element vocabulary.\n *\n * Single source of truth for the XSLT namespace URI and for the element names\n * the engine can instantiate. `element-available()` reports against this table,\n * so it stays in step with what {@link XsltEngine#processXsltElement} handles.\n */\n\n\"use strict\";\n\n/** The XSLT 1.0 namespace URI. */\nexport const XSLT_NAMESPACE = \"http://www.w3.org/1999/XSL/Transform\";\n\n/**\n * Element names the engine dispatches, i.e. every element that\n * `element-available()` must report as supported.\n */\nexport const XSLT_ELEMENTS = Object.freeze([\n \"apply-imports\",\n \"apply-templates\",\n \"attribute\",\n \"call-template\",\n \"choose\",\n \"comment\",\n \"copy\",\n \"copy-of\",\n \"element\",\n \"fallback\",\n \"for-each\",\n \"if\",\n \"message\",\n \"number\",\n \"otherwise\",\n \"param\",\n \"processing-instruction\",\n \"sort\",\n \"text\",\n \"value-of\",\n \"variable\",\n \"when\",\n \"with-param\",\n]);\n\nconst ELEMENT_SET = new Set(XSLT_ELEMENTS);\n\n/**\n * Check whether an XSLT element local name is supported by the engine.\n *\n * @param {string} localName - Element local name, e.g. `for-each`\n * @returns {boolean} True when the engine instantiates the element\n *\n * @example\n * isXsltElementAvailable('for-each'); // true\n */\nexport function isXsltElementAvailable(localName) {\n return ELEMENT_SET.has(localName);\n}\n", "/**\n * XSLT 1.0 `format-number()` picture string formatting.\n *\n * Implements the subset of the JDK `DecimalFormat` picture syntax that XSLT 1.0\n * requires: grouping separator, decimal separator, minimum/maximum fraction\n * digits, minimum integer digits, percent and per-mille scaling and an optional\n * negative subpattern. All symbols are taken from an `xsl:decimal-format`\n * declaration so alternative digits and separators are honoured.\n */\n\n\"use strict\";\n\n/** Symbols of the unnamed, default `xsl:decimal-format`. */\nexport const DEFAULT_DECIMAL_FORMAT = Object.freeze({\n decimalSeparator: \".\",\n groupingSeparator: \",\",\n percent: \"%\",\n perMille: \"\u2030\",\n zeroDigit: \"0\",\n digit: \"#\",\n patternSeparator: \";\",\n infinity: \"Infinity\",\n nan: \"NaN\",\n minusSign: \"-\",\n});\n\n/**\n * Split a picture string into its positive and optional negative subpattern.\n *\n * @param {string} pattern - The picture string\n * @param {Object} format - Decimal format symbols\n * @returns {{positive: string, negative: (string|null)}} The subpatterns\n */\nfunction splitSubPatterns(pattern, format) {\n const index = pattern.indexOf(format.patternSeparator);\n if (index === -1) return { positive: pattern, negative: null };\n return {\n positive: pattern.substring(0, index),\n negative: pattern.substring(index + format.patternSeparator.length),\n };\n}\n\n/**\n * Parse a single subpattern into a formatting description.\n *\n * @param {string} subPattern - One subpattern of a picture string\n * @param {Object} format - Decimal format symbols\n * @returns {Object} Prefix, suffix, digit counts, grouping size and multiplier\n */\nfunction parseSubPattern(subPattern, format) {\n const special = new Set([\n format.digit,\n format.zeroDigit,\n format.groupingSeparator,\n format.decimalSeparator,\n ]);\n\n let start = 0;\n while (start < subPattern.length && !special.has(subPattern[start])) start++;\n\n let end = start;\n while (end < subPattern.length && special.has(subPattern[end])) end++;\n\n const prefix = subPattern.substring(0, start);\n const numeric = subPattern.substring(start, end);\n const suffix = subPattern.substring(end);\n\n const decimalIndex = numeric.indexOf(format.decimalSeparator);\n const integerPart =\n decimalIndex === -1 ? numeric : numeric.substring(0, decimalIndex);\n const fractionPart =\n decimalIndex === -1 ? \"\" : numeric.substring(decimalIndex + 1);\n\n const groupingIndex = integerPart.lastIndexOf(format.groupingSeparator);\n const affixes = prefix + suffix;\n\n let multiplier = 1;\n if (affixes.includes(format.percent)) multiplier = 100;\n else if (affixes.includes(format.perMille)) multiplier = 1000;\n\n return {\n prefix,\n suffix,\n multiplier,\n minInteger: countOccurrences(integerPart, format.zeroDigit),\n minFraction: countOccurrences(fractionPart, format.zeroDigit),\n maxFraction: Math.min(fractionPart.length, 100),\n groupingSize:\n groupingIndex === -1 ? 0 : integerPart.length - groupingIndex - 1,\n };\n}\n\n/**\n * Count occurrences of a character inside a string.\n *\n * @param {string} text - The text to scan\n * @param {string} char - The character to count\n * @returns {number} Number of occurrences\n */\nfunction countOccurrences(text, char) {\n let total = 0;\n for (const current of text) {\n if (current === char) total++;\n }\n return total;\n}\n\n/**\n * Insert grouping separators into a run of integer digits.\n *\n * @param {string} digits - Integer digits, most significant first\n * @param {number} size - Grouping size, 0 disables grouping\n * @param {string} separator - The grouping separator\n * @returns {string} The grouped digits\n */\nfunction applyGrouping(digits, size, separator) {\n if (size <= 0 || digits.length <= size) return digits;\n\n let result = \"\";\n for (let i = 0; i < digits.length; i++) {\n const fromEnd = digits.length - i;\n if (i > 0 && fromEnd % size === 0) result += separator;\n result += digits[i];\n }\n return result;\n}\n\n/**\n * Translate ASCII digits to the digits of the decimal format.\n *\n * @param {string} text - Text containing ASCII digits\n * @param {string} zeroDigit - The format's zero digit\n * @returns {string} Text using the format's digit family\n */\nfunction translateDigits(text, zeroDigit) {\n const offset = zeroDigit.codePointAt(0) - 48;\n if (offset === 0) return text;\n return text.replaceAll(/\\d/g, (digit) =>\n String.fromCodePoint(digit.codePointAt(0) + offset),\n );\n}\n\n/**\n * Format the magnitude of a finite number according to a parsed subpattern.\n *\n * @param {number} magnitude - Absolute, already scaled value\n * @param {Object} spec - Parsed subpattern\n * @param {Object} format - Decimal format symbols\n * @returns {string} The formatted number without prefix or suffix\n */\nfunction formatMagnitude(magnitude, spec, format) {\n const fixed = magnitude.toFixed(spec.maxFraction);\n const [rawInteger, rawFraction = \"\"] = fixed.split(\".\");\n\n let fraction = rawFraction;\n while (fraction.length > spec.minFraction && fraction.endsWith(\"0\")) {\n fraction = fraction.slice(0, -1);\n }\n\n let integer = rawInteger.padStart(spec.minInteger, \"0\");\n if (spec.minInteger === 0 && integer === \"0\" && fraction.length > 0) {\n integer = \"\";\n }\n\n integer = applyGrouping(integer, spec.groupingSize, format.groupingSeparator);\n\n const body =\n fraction.length > 0\n ? integer + format.decimalSeparator + fraction\n : integer;\n\n return translateDigits(body, format.zeroDigit);\n}\n\n/**\n * Format a number using an XSLT 1.0 picture string.\n *\n * @param {number} value - The number to format\n * @param {string} pattern - The picture string, e.g. `#,##0.00`\n * @param {Object} [decimalFormat] - `xsl:decimal-format` symbols\n * @returns {string} The formatted number\n *\n * @example\n * formatNumber(1234.5, '#,##0.00'); // '1,234.50'\n * formatNumber(-1234, '#,##0;(#,##0)'); // '(1,234)'\n */\nexport function formatNumber(\n value,\n pattern,\n decimalFormat = DEFAULT_DECIMAL_FORMAT,\n) {\n const format = { ...DEFAULT_DECIMAL_FORMAT, ...decimalFormat };\n\n if (typeof value !== \"number\" || Number.isNaN(value)) return format.nan;\n\n const subPatterns = splitSubPatterns(pattern, format);\n const positive = parseSubPattern(subPatterns.positive, format);\n const isNegative = value < 0;\n\n let spec = positive;\n let prefix = positive.prefix;\n let suffix = positive.suffix;\n\n if (isNegative) {\n if (subPatterns.negative !== null) {\n spec = parseSubPattern(subPatterns.negative, format);\n prefix = spec.prefix;\n suffix = spec.suffix;\n } else {\n prefix = format.minusSign + positive.prefix;\n }\n }\n\n const magnitude = Math.abs(value) * spec.multiplier;\n const body = Number.isFinite(magnitude)\n ? formatMagnitude(magnitude, spec, format)\n : format.infinity;\n\n return prefix + body + suffix;\n}\n", "/**\n * XSLT-defined XPath functions.\n *\n * XSLT 1.0 section 12 adds functions to the XPath function library. They live\n * here rather than in `src/xpath` so that module stays a pure XPath 1.0\n * implementation; the engine registers this map on its evaluator through\n * {@link XPathEvaluator#registerFunctions}.\n */\n\n\"use strict\";\n\nimport { formatNumber, DEFAULT_DECIMAL_FORMAT } from \"./formatNumber.js\";\nimport { isXsltElementAvailable, XSLT_NAMESPACE } from \"./elements.js\";\n\n/** Vendor identification reported by `system-property()`. */\nexport const VENDOR = \"@tradik/xslt-processor\";\n\n/** Vendor URL reported by `system-property()`. */\nexport const VENDOR_URL = \"https://github.com/spagu/XSLT-Processor\";\n\n/**\n * Values reported by `system-property()`, keyed by property name.\n *\n * The XSLT version is reported as the string `\"1\"`; XPath 1.0 converts it to\n * the number 1 wherever a numeric comparison or arithmetic is used.\n */\nconst SYSTEM_PROPERTIES = Object.freeze({\n \"xsl:version\": \"1\",\n \"xsl:vendor\": VENDOR,\n \"xsl:vendor-url\": VENDOR_URL,\n});\n\n/**\n * Get the document that owns a node.\n *\n * @param {Node} node - Any node\n * @returns {Document} The owning document, or the node when it is a document\n */\nfunction ownerDocumentOf(node) {\n return node.ownerDocument || node;\n}\n\n/**\n * Convert an evaluated argument to the list of strings it denotes.\n *\n * Node-sets yield the string value of every node, other types yield one string.\n *\n * @param {XPathEvaluator} evaluator - The evaluator providing the conversions\n * @param {(value: *) => string} stringify - The XPath `string()` conversion\n * @param {*} value - An evaluated XPath value\n * @returns {string[]} The string values\n */\nfunction toStringList(evaluator, stringify, value) {\n if (Array.isArray(value)) {\n return value.map((node) => evaluator.getStringValue(node));\n }\n return [stringify(value)];\n}\n\n/**\n * Split a QName into its prefix and local part.\n *\n * @param {string} qname - A possibly prefixed name\n * @returns {{prefix: (string|null), localName: string}} The parts of the name\n */\nfunction splitQName(qname) {\n const colon = qname.indexOf(\":\");\n if (colon === -1) return { prefix: null, localName: qname };\n return {\n prefix: qname.substring(0, colon),\n localName: qname.substring(colon + 1),\n };\n}\n\n/**\n * Build the XSLT function map for an engine.\n *\n * @param {import('./engine.js').XsltEngine} engine - The engine providing loaders, keys and formats\n * @returns {Object<string, Function>} Functions ready for `registerFunctions`\n *\n * @example\n * evaluator.registerFunctions(createXsltFunctions(engine));\n */\nexport function createXsltFunctions(engine) {\n const evaluator = engine.xpathEvaluator;\n\n /**\n * The XPath `string()` conversion of the evaluator.\n *\n * `XPathEvaluator#toString` shadows `Object#toString` and takes the value to\n * convert as its argument, so it is bound once under an unambiguous name.\n *\n * @type {(value: *) => string}\n */\n const stringify = evaluator.toString.bind(evaluator);\n const evaluate = (arg, ctx) => evaluator.evaluate(arg, ctx);\n const asString = (arg, ctx) => stringify(evaluate(arg, ctx));\n\n return {\n /**\n * `document(object, base?)` - load external XML documents.\n *\n * An empty URI denotes the stylesheet itself. Without a document loader, or\n * when the loader returns null, the result is an empty node-set. The\n * optional second argument is read as a base URI string.\n */\n document: (args, ctx) => {\n const baseUri = args.length > 1 ? asString(args[1], ctx) : engine.baseUri;\n const uris = toStringList(evaluator, stringify, evaluate(args[0], ctx));\n const result = [];\n\n for (const uri of uris) {\n const doc = engine.loadDocument(uri, baseUri || engine.baseUri);\n if (doc && !result.includes(doc)) result.push(doc);\n }\n\n return result;\n },\n\n /** `key(name, value)` - look up nodes through an `xsl:key` index. */\n key: (args, ctx) => {\n const name = asString(args[0], ctx);\n const values = toStringList(evaluator, stringify, evaluate(args[1], ctx));\n return engine.keyRegistry.lookup(name, values, ownerDocumentOf(ctx.node));\n },\n\n /** `format-number(number, pattern, decimalFormat?)`. */\n \"format-number\": (args, ctx) => {\n const value = evaluator.toNumber(evaluate(args[0], ctx));\n const pattern = asString(args[1], ctx);\n const formatName = args.length > 2 ? asString(args[2], ctx) : \"\";\n const format =\n engine.decimalFormats[formatName] || DEFAULT_DECIMAL_FORMAT;\n return formatNumber(value, pattern, format);\n },\n\n /** `current()` - the XSLT current node, not the XPath context node. */\n current: (args, ctx) => {\n const currentNode = ctx.hostContext?.currentNode;\n return currentNode ? [currentNode] : [ctx.node];\n },\n\n /** `generate-id(node-set?)` - a stable id for the life of the transform. */\n \"generate-id\": (args, ctx) => {\n let node = ctx.node;\n\n if (args.length > 0) {\n const nodeSet = evaluate(args[0], ctx);\n node = Array.isArray(nodeSet) ? nodeSet[0] : nodeSet;\n }\n\n return node ? engine.generateId(node) : \"\";\n },\n\n /** `system-property(name)` - XSLT version and vendor information. */\n \"system-property\": (args, ctx) => {\n const name = asString(args[0], ctx);\n return Object.hasOwn(SYSTEM_PROPERTIES, name)\n ? SYSTEM_PROPERTIES[name]\n : \"\";\n },\n\n /** `function-available(name)` - reflects the evaluator function table. */\n \"function-available\": (args, ctx) => {\n const name = asString(args[0], ctx);\n return Object.hasOwn(evaluator.functions, name);\n },\n\n /** `element-available(name)` - reflects the XSLT elements the engine runs. */\n \"element-available\": (args, ctx) => {\n const { prefix, localName } = splitQName(asString(args[0], ctx));\n if (!prefix) return false;\n\n const namespaceUri =\n ctx.namespaces[prefix] ?? (prefix === \"xsl\" ? XSLT_NAMESPACE : null);\n\n return (\n namespaceUri === XSLT_NAMESPACE && isXsltElementAvailable(localName)\n );\n },\n\n /**\n * `unparsed-entity-uri(name)` - always empty.\n *\n * Unparsed entity declarations are not exposed by the DOM, so this\n * processor cannot resolve them; returning the empty string keeps\n * stylesheets that call the function working.\n */\n \"unparsed-entity-uri\": () => \"\",\n };\n}\n", "/**\n * `xsl:key` indexing for the XSLT `key()` function.\n *\n * Indexes are built lazily, once per (document, key name) pair, and cached in a\n * `WeakMap` so source documents stay garbage collectable. The registry is\n * deliberately decoupled from the engine: pattern matching and `use` evaluation\n * are injected as callbacks.\n */\n\n\"use strict\";\n\n/**\n * Lazily built, per-document indexes for all declared keys.\n */\nexport class KeyIndexRegistry {\n /**\n * @param {Object} options - Registry configuration\n * @param {Object<string, {match: string, use: string}>} options.keys - Declared keys by name\n * @param {(node: Node, pattern: string) => boolean} options.matchesPattern - XSLT pattern matcher\n * @param {(node: Node, expression: string) => string[]} options.evaluateUse - `use` evaluator returning key values\n */\n constructor({ keys, matchesPattern, evaluateUse }) {\n this.keys = keys;\n this.matchesPattern = matchesPattern;\n this.evaluateUse = evaluateUse;\n this.cache = new WeakMap();\n }\n\n /**\n * Drop every cached index, for example after the key declarations changed.\n *\n * @returns {void}\n *\n * @example\n * registry.clear();\n */\n clear() {\n this.cache = new WeakMap();\n }\n\n /**\n * Look up the nodes indexed under one or more key values.\n *\n * @param {string} name - The key name\n * @param {string|string[]} values - One key value, or several to union\n * @param {Document} doc - The document to search\n * @returns {Node[]} Matching nodes in document order, without duplicates\n * @throws {Error} When the key name was never declared\n *\n * @example\n * registry.lookup('byId', 'a1', xmlDoc);\n */\n lookup(name, values, doc) {\n if (!Object.hasOwn(this.keys, name)) {\n throw new Error(`Undefined key: ${name}`);\n }\n\n const index = this.getIndex(name, doc);\n const wanted = Array.isArray(values) ? values : [values];\n const result = [];\n\n for (const value of wanted) {\n for (const node of index.get(value) || []) {\n if (!result.includes(node)) result.push(node);\n }\n }\n\n return result;\n }\n\n /**\n * Get (building if needed) the index of one key for one document.\n *\n * @param {string} name - The key name\n * @param {Document} doc - The document being indexed\n * @returns {Map<string, Node[]>} Key value to nodes\n */\n getIndex(name, doc) {\n let byName = this.cache.get(doc);\n if (!byName) {\n byName = new Map();\n this.cache.set(doc, byName);\n }\n\n let index = byName.get(name);\n if (!index) {\n index = this.buildIndex(name, doc);\n byName.set(name, index);\n }\n\n return index;\n }\n\n /**\n * Build the index of one key for one document.\n *\n * @param {string} name - The key name\n * @param {Document} doc - The document being indexed\n * @returns {Map<string, Node[]>} Key value to nodes\n */\n buildIndex(name, doc) {\n const { match, use } = this.keys[name];\n const index = new Map();\n\n for (const node of documentOrderNodes(doc)) {\n if (!this.matchesPattern(node, match)) continue;\n\n for (const value of this.evaluateUse(node, use)) {\n const bucket = index.get(value);\n if (bucket) bucket.push(node);\n else index.set(value, [node]);\n }\n }\n\n return index;\n }\n}\n\n/**\n * Walk a document in document order, including attribute nodes.\n *\n * @param {Node} root - The document or subtree root\n * @yields {Node} Every node of the subtree\n */\nfunction* documentOrderNodes(root) {\n const stack = [root];\n\n while (stack.length > 0) {\n const current = stack.pop();\n yield current;\n\n if (current.nodeType === 1 && current.attributes) {\n for (const attribute of current.attributes) yield attribute;\n }\n\n const children = current.childNodes;\n if (children) {\n for (let i = children.length - 1; i >= 0; i--) stack.push(children[i]);\n }\n }\n}\n", "/**\n * `xsl:number` counting and number-to-string conversion.\n *\n * Counting is kept independent from the engine: callers pass a `matcher`\n * callback that answers \"does this node match this XSLT pattern\", which keeps\n * this module free of any XPath dependency and easy to test in isolation.\n */\n\n\"use strict\";\n\n/** Node types that participate in `xsl:number` counting. */\nconst COUNTABLE_NODE_TYPES = new Set([1, 3, 4, 7, 8]);\n\n/**\n * Default `count` pattern behaviour: match nodes of the same type and name.\n *\n * @param {Node} candidate - The node being considered\n * @param {Node} node - The node `xsl:number` is numbering\n * @returns {boolean} True when the candidate is of the same kind\n */\nfunction matchesDefaultCount(candidate, node) {\n if (candidate.nodeType !== node.nodeType) return false;\n if (candidate.nodeType === 1) return candidate.nodeName === node.nodeName;\n return true;\n}\n\n/**\n * Build the predicate used to decide whether a node is counted.\n *\n * @param {Node} node - The node being numbered\n * @param {string|null} count - The `count` pattern, if any\n * @param {(node: Node, pattern: string) => boolean} matcher - Pattern matcher\n * @returns {(candidate: Node) => boolean} The predicate\n */\nfunction createCountPredicate(node, count, matcher) {\n if (count) return (candidate) => matcher(candidate, count);\n return (candidate) => matchesDefaultCount(candidate, node);\n}\n\n/**\n * Build the predicate marking `from` boundaries.\n *\n * @param {string|null} from - The `from` pattern, if any\n * @param {(node: Node, pattern: string) => boolean} matcher - Pattern matcher\n * @returns {(candidate: Node) => boolean} The predicate, always false without `from`\n */\nfunction createFromPredicate(from, matcher) {\n if (!from) return () => false;\n return (candidate) => matcher(candidate, from);\n}\n\n/**\n * Count preceding siblings of a node that satisfy the predicate.\n *\n * @param {Node} node - The node whose position is computed\n * @param {(candidate: Node) => boolean} isCounted - Counting predicate\n * @returns {number} The 1-based position\n */\nfunction siblingPosition(node, isCounted) {\n let position = 1;\n let sibling = node.previousSibling;\n while (sibling) {\n if (COUNTABLE_NODE_TYPES.has(sibling.nodeType) && isCounted(sibling)) {\n position++;\n }\n sibling = sibling.previousSibling;\n }\n return position;\n}\n\n/**\n * Collect nodes in document order up to and including a target node.\n *\n * @param {Node} target - The node at which traversal stops\n * @returns {Node[]} Nodes in document order, ending with the target\n */\nfunction nodesUpToTarget(target) {\n const root = target.ownerDocument || target;\n const result = [];\n const stack = [root];\n\n while (stack.length > 0) {\n const current = stack.pop();\n result.push(current);\n if (current === target) break;\n const children = current.childNodes;\n if (children) {\n for (let i = children.length - 1; i >= 0; i--) stack.push(children[i]);\n }\n }\n\n return result;\n}\n\n/**\n * Count a node according to `level=\"single\"`.\n *\n * @param {Node} node - The node being numbered\n * @param {(candidate: Node) => boolean} isCounted - Counting predicate\n * @param {(candidate: Node) => boolean} isFrom - Boundary predicate\n * @returns {number[]} A single number, or an empty list when nothing matches\n */\nfunction countSingle(node, isCounted, isFrom) {\n let current = node;\n while (current && current.nodeType !== 9) {\n if (isFrom(current)) return [];\n if (isCounted(current)) return [siblingPosition(current, isCounted)];\n current = current.parentNode;\n }\n return [];\n}\n\n/**\n * Count a node according to `level=\"multiple\"`.\n *\n * @param {Node} node - The node being numbered\n * @param {(candidate: Node) => boolean} isCounted - Counting predicate\n * @param {(candidate: Node) => boolean} isFrom - Boundary predicate\n * @returns {number[]} Numbers from the outermost ancestor inwards\n */\nfunction countMultiple(node, isCounted, isFrom) {\n const numbers = [];\n let current = node;\n\n while (current && current.nodeType !== 9) {\n if (isFrom(current)) break;\n if (isCounted(current)) {\n numbers.unshift(siblingPosition(current, isCounted));\n }\n current = current.parentNode;\n }\n\n return numbers;\n}\n\n/**\n * Count a node according to `level=\"any\"`.\n *\n * @param {Node} node - The node being numbered\n * @param {(candidate: Node) => boolean} isCounted - Counting predicate\n * @param {(candidate: Node) => boolean} isFrom - Boundary predicate\n * @returns {number[]} A single number, or an empty list when nothing matches\n */\nfunction countAny(node, isCounted, isFrom) {\n let total = 0;\n\n for (const candidate of nodesUpToTarget(node)) {\n if (!COUNTABLE_NODE_TYPES.has(candidate.nodeType)) continue;\n if (isFrom(candidate)) {\n total = 0;\n continue;\n }\n if (isCounted(candidate)) total++;\n }\n\n return total > 0 ? [total] : [];\n}\n\n/**\n * Compute the number sequence for an `xsl:number` instruction.\n *\n * @param {Node} node - The current node\n * @param {{level?: string, count?: string|null, from?: string|null}} options - Instruction attributes\n * @param {(node: Node, pattern: string) => boolean} matcher - XSLT pattern matcher\n * @returns {number[]} The computed numbers, outermost first\n *\n * @example\n * countXsltNumber(item, { level: 'any' }, matcher); // [2]\n */\nexport function countXsltNumber(node, options, matcher) {\n const { level = \"single\", count = null, from = null } = options;\n const isCounted = createCountPredicate(node, count, matcher);\n const isFrom = createFromPredicate(from, matcher);\n\n if (level === \"any\") return countAny(node, isCounted, isFrom);\n if (level === \"multiple\") return countMultiple(node, isCounted, isFrom);\n return countSingle(node, isCounted, isFrom);\n}\n", "/**\n * `xsl:number` number-to-string conversion.\n *\n * Renders the number sequence produced by {@link countXsltNumber} using the\n * `format` attribute of `xsl:number`: numeric tokens (`1`, `01`), alphabetic\n * tokens (`a`, `A`) and Roman numerals (`i`, `I`), together with the prefix,\n * separators and suffix taken from the format string itself.\n */\n\n\"use strict\";\n\n/**\n * Convert a positive integer to a bijective base-26 alphabetic sequence.\n *\n * @param {number} value - The number to convert\n * @param {boolean} upperCase - Whether to emit upper case letters\n * @returns {string} The alphabetic representation, e.g. `27` becomes `aa`\n */\nfunction toAlphabetic(value, upperCase) {\n let remaining = value;\n let result = \"\";\n\n while (remaining > 0) {\n const index = (remaining - 1) % 26;\n result = String.fromCodePoint((upperCase ? 65 : 97) + index) + result;\n remaining = Math.floor((remaining - 1) / 26);\n }\n\n return result;\n}\n\n/** Roman numeral building blocks, largest first. */\nconst ROMAN_NUMERALS = Object.freeze([\n [\"M\", 1000],\n [\"CM\", 900],\n [\"D\", 500],\n [\"CD\", 400],\n [\"C\", 100],\n [\"XC\", 90],\n [\"L\", 50],\n [\"XL\", 40],\n [\"X\", 10],\n [\"IX\", 9],\n [\"V\", 5],\n [\"IV\", 4],\n [\"I\", 1],\n]);\n\n/**\n * Convert a positive integer to a Roman numeral.\n *\n * @param {number} value - The number to convert\n * @returns {string} The upper case Roman numeral\n *\n * @example\n * toRoman(2004); // 'MMIV'\n */\nexport function toRoman(value) {\n let remaining = value;\n let result = \"\";\n\n for (const [numeral, amount] of ROMAN_NUMERALS) {\n while (remaining >= amount) {\n result += numeral;\n remaining -= amount;\n }\n }\n\n return result;\n}\n\n/**\n * Render one number with a single `xsl:number` format token.\n *\n * @param {number} value - The number to render\n * @param {string} token - The format token, e.g. `1`, `01`, `a`, `I`\n * @returns {string} The rendered number\n */\nfunction formatToken(value, token) {\n if (/^\\d+$/.test(token)) {\n return String(value).padStart(token.length, \"0\");\n }\n\n if (value <= 0) return String(value);\n\n switch (token) {\n case \"a\":\n return toAlphabetic(value, false);\n case \"A\":\n return toAlphabetic(value, true);\n case \"i\":\n return toRoman(value).toLowerCase();\n case \"I\":\n return toRoman(value);\n default:\n return String(value);\n }\n}\n\n/**\n * Split an `xsl:number` format string into prefix, tokens, separators, suffix.\n *\n * @param {string} format - The format attribute value\n * @returns {{prefix: string, suffix: string, tokens: string[], separators: string[]}} The parsed format\n */\nfunction parseFormat(format) {\n const parts = format.match(/[a-zA-Z0-9]+|[^a-zA-Z0-9]+/g) || [];\n const isToken = (part) => /^[a-zA-Z0-9]+$/.test(part);\n\n const tokens = [];\n const separators = [];\n let prefix = \"\";\n let suffix = \"\";\n\n for (const part of parts) {\n if (isToken(part)) tokens.push(part);\n else if (tokens.length === 0) prefix = part;\n else separators.push(part);\n }\n\n if (parts.length > 0 && tokens.length > 0 && !isToken(parts.at(-1))) {\n suffix = separators.pop();\n }\n\n if (tokens.length === 0) tokens.push(\"1\");\n\n return { prefix, suffix, tokens, separators };\n}\n\n/**\n * Format a number sequence produced by {@link countXsltNumber}.\n *\n * @param {number[]} numbers - The numbers, outermost first\n * @param {string} [format] - The `format` attribute value\n * @returns {string} The formatted string, empty when there is nothing to number\n *\n * @example\n * formatXsltNumber([2, 3], '1.1'); // '2.3'\n */\nexport function formatXsltNumber(numbers, format = \"1\") {\n if (numbers.length === 0) return \"\";\n\n const { prefix, suffix, tokens, separators } = parseFormat(format);\n let result = prefix;\n\n numbers.forEach((value, index) => {\n if (index > 0) {\n const separator = separators[index - 1] ?? separators.at(-1) ?? \".\";\n result += separator;\n }\n result += formatToken(value, tokens[index] ?? tokens.at(-1));\n });\n\n return result + suffix;\n}\n", "/**\n * URI helpers for XSLT stylesheet and document resolution.\n *\n * Kept deliberately small and dependency free: the engine only needs enough\n * URI arithmetic to turn a relative `href` into something a host supplied\n * loader can resolve, plus fragment removal for the `document()` function.\n */\n\n\"use strict\";\n\n/** Matches an absolute URI such as `http://`, `https://` or `file://`. */\nconst ABSOLUTE_URI_PATTERN = /^[a-zA-Z][a-zA-Z0-9+.-]*:/;\n\n/**\n * Resolve a possibly relative URI against a base URI.\n *\n * Absolute URIs (with a scheme) and root relative URIs (starting with `/`)\n * are returned untouched, as is any URI when no base is available.\n *\n * @param {string} href - The URI to resolve\n * @param {string} [baseUri] - The base URI, typically the stylesheet location\n * @returns {string} The resolved URI\n *\n * @example\n * resolveUri('common.xsl', '/styles/main.xsl'); // '/styles/common.xsl'\n */\nexport function resolveUri(href, baseUri) {\n if (!href) return href;\n if (!baseUri || isAbsoluteUri(href) || href.startsWith(\"/\")) {\n return href;\n }\n\n const lastSlash = baseUri.lastIndexOf(\"/\");\n const baseDir = lastSlash >= 0 ? baseUri.substring(0, lastSlash + 1) : \"\";\n\n return baseDir + href;\n}\n\n/**\n * Check whether a URI is absolute (has a scheme).\n *\n * @param {string} uri - The URI to inspect\n * @returns {boolean} True when the URI carries a scheme\n *\n * @example\n * isAbsoluteUri('https://example.com/a.xml'); // true\n */\nexport function isAbsoluteUri(uri) {\n return ABSOLUTE_URI_PATTERN.test(uri);\n}\n\n/**\n * Remove a fragment identifier from a URI.\n *\n * XSLT 1.0 leaves the meaning of fragment identifiers passed to `document()`\n * implementation defined; this processor ignores them.\n *\n * @param {string} uri - The URI, possibly carrying a `#fragment`\n * @returns {string} The URI without its fragment\n *\n * @example\n * stripFragment('data.xml#section'); // 'data.xml'\n */\nexport function stripFragment(uri) {\n if (typeof uri !== \"string\") return \"\";\n const hash = uri.indexOf(\"#\");\n return hash === -1 ? uri : uri.substring(0, hash);\n}\n", "/**\n * `xsl:strip-space` and `xsl:preserve-space` support.\n *\n * XSLT 1.0 removes whitespace-only text nodes from the source tree before the\n * transformation starts. This module builds a stripped copy of the source so\n * the caller's document is never mutated, and resolves the usual conflict rules\n * between the two declarations.\n */\n\n\"use strict\";\n\n/** Node type of a document type declaration, which cannot be imported. */\nconst DOCUMENT_TYPE_NODE = 10;\n\n/**\n * Compute the XSLT default priority of an element name test.\n *\n * @param {string} nameTest - A name test such as `*`, `ns:*` or `item`\n * @returns {number} The default priority\n */\nfunction nameTestPriority(nameTest) {\n if (nameTest === \"*\") return -0.5;\n if (nameTest.endsWith(\":*\")) return -0.25;\n return 0;\n}\n\n/**\n * Check whether an element matches a name test.\n *\n * @param {Element} element - The element to test\n * @param {string} nameTest - A name test such as `*`, `ns:*` or `item`\n * @returns {boolean} True when the element matches\n */\nfunction matchesNameTest(element, nameTest) {\n if (nameTest === \"*\") return true;\n\n if (nameTest.endsWith(\":*\")) {\n const prefix = nameTest.slice(0, -2);\n return element.nodeName.startsWith(`${prefix}:`);\n }\n\n return element.nodeName === nameTest || element.localName === nameTest;\n}\n\n/**\n * Decides which whitespace-only text nodes of the source tree are removed.\n */\nexport class WhitespaceFilter {\n /**\n * @param {string[]} [stripSpace] - Name tests from `xsl:strip-space`\n * @param {string[]} [preserveSpace] - Name tests from `xsl:preserve-space`\n */\n constructor(stripSpace = [], preserveSpace = []) {\n this.stripSpace = stripSpace;\n this.preserveSpace = preserveSpace;\n }\n\n /**\n * Whether the filter can remove anything at all.\n *\n * @returns {boolean} True when at least one `xsl:strip-space` was declared\n *\n * @example\n * new WhitespaceFilter(['*']).isActive(); // true\n */\n isActive() {\n return this.stripSpace.length > 0;\n }\n\n /**\n * Whether whitespace-only children of an element are stripped.\n *\n * The most specific name test wins; `xsl:preserve-space` wins ties.\n *\n * @param {Element} element - The parent element\n * @returns {boolean} True when whitespace-only text children are removed\n *\n * @example\n * new WhitespaceFilter(['*'], ['pre']).isStripped(preElement); // false\n */\n isStripped(element) {\n let stripPriority = -Infinity;\n let preservePriority = -Infinity;\n\n for (const nameTest of this.stripSpace) {\n if (matchesNameTest(element, nameTest)) {\n stripPriority = Math.max(stripPriority, nameTestPriority(nameTest));\n }\n }\n\n for (const nameTest of this.preserveSpace) {\n if (matchesNameTest(element, nameTest)) {\n preservePriority = Math.max(\n preservePriority,\n nameTestPriority(nameTest),\n );\n }\n }\n\n return stripPriority > -Infinity && stripPriority > preservePriority;\n }\n}\n\n/**\n * Check whether `xml:space=\"preserve\"` is in scope for a node.\n *\n * @param {Node} node - The node to inspect\n * @returns {boolean} True when whitespace must be preserved\n */\nfunction hasXmlSpacePreserve(node) {\n let current = node;\n\n while (current?.nodeType === 1) {\n const value = current.getAttribute(\"xml:space\");\n if (value === \"preserve\") return true;\n if (value === \"default\") return false;\n current = current.parentNode;\n }\n\n return false;\n}\n\n/**\n * Remove whitespace-only text nodes from a subtree.\n *\n * @param {Node} root - The root of the subtree to prune\n * @param {WhitespaceFilter} filter - The configured filter\n * @returns {void}\n */\nfunction pruneWhitespace(root, filter) {\n const doomed = [];\n const stack = [root];\n\n while (stack.length > 0) {\n const current = stack.pop();\n\n if (\n (current.nodeType === 3 || current.nodeType === 4) &&\n current.nodeValue !== null &&\n current.nodeValue.trim() === \"\" &&\n current.parentNode?.nodeType === 1 &&\n filter.isStripped(current.parentNode) &&\n !hasXmlSpacePreserve(current.parentNode)\n ) {\n doomed.push(current);\n }\n\n const children = current.childNodes;\n if (children) {\n for (let i = children.length - 1; i >= 0; i--) stack.push(children[i]);\n }\n }\n\n for (const node of doomed) node.remove();\n}\n\n/**\n * Build a copy of the source tree with stripped whitespace removed.\n *\n * @param {Node} sourceNode - The source document or element\n * @param {WhitespaceFilter} filter - The configured filter\n * @param {Document} targetDoc - An empty document owning the copy\n * @returns {Node} The stripped copy, a document when the source was a document\n *\n * @example\n * const stripped = stripWhitespaceNodes(xmlDoc, filter, emptyDoc);\n */\nexport function stripWhitespaceNodes(sourceNode, filter, targetDoc) {\n let root;\n\n if (sourceNode.nodeType === 9) {\n root = targetDoc;\n for (const child of Array.from(sourceNode.childNodes)) {\n if (child.nodeType === DOCUMENT_TYPE_NODE) continue;\n targetDoc.appendChild(targetDoc.importNode(child, true));\n }\n } else {\n root = targetDoc.importNode(sourceNode, true);\n targetDoc.appendChild(root);\n }\n\n pruneWhitespace(root, filter);\n return root;\n}\n", "/**\n * Literal result element support: namespace aliasing and attribute filtering.\n *\n * `xsl:namespace-alias` rewrites the namespace of literal result elements and\n * attributes, which is what makes it possible for a stylesheet to generate\n * another stylesheet. Attribute filtering keeps XSLT-only attributes such as\n * `xsl:use-attribute-sets` out of the result tree.\n */\n\n\"use strict\";\n\n/**\n * Resolve a namespace prefix against the declarations in scope of a node.\n *\n * Falls back to walking `xmlns` attributes when the DOM implementation does not\n * provide `lookupNamespaceURI`.\n *\n * @param {Element} node - The element whose scope is searched\n * @param {string|null} prefix - The prefix, or null for the default namespace\n * @returns {string|null} The namespace URI, or null when undeclared\n *\n * @example\n * lookupNamespaceUri(stylesheetElement, 'xsl');\n */\nexport function lookupNamespaceUri(node, prefix) {\n if (typeof node.lookupNamespaceURI === \"function\") {\n const found = node.lookupNamespaceURI(prefix);\n if (found) return found;\n }\n\n const attributeName = prefix ? `xmlns:${prefix}` : \"xmlns\";\n let current = node;\n\n while (current?.nodeType === 1) {\n const value = current.getAttribute(attributeName);\n if (value) return value;\n current = current.parentNode;\n }\n\n return null;\n}\n\n/**\n * The `xsl:namespace-alias` declarations of a stylesheet.\n */\nexport class NamespaceAliasMap {\n constructor() {\n this.byUri = new Map();\n }\n\n /**\n * Record one `xsl:namespace-alias` declaration.\n *\n * @param {Element} node - The `xsl:namespace-alias` element\n * @returns {void}\n *\n * @example\n * aliases.add(namespaceAliasElement);\n */\n add(node) {\n const stylesheetPrefix = node.getAttribute(\"stylesheet-prefix\");\n const resultPrefix = node.getAttribute(\"result-prefix\");\n if (!stylesheetPrefix || !resultPrefix) return;\n\n const fromUri = lookupNamespaceUri(\n node,\n stylesheetPrefix === \"#default\" ? null : stylesheetPrefix,\n );\n if (!fromUri) return;\n\n const isDefaultResult = resultPrefix === \"#default\";\n const toUri = lookupNamespaceUri(\n node,\n isDefaultResult ? null : resultPrefix,\n );\n\n this.byUri.set(fromUri, {\n uri: toUri,\n prefix: isDefaultResult ? null : resultPrefix,\n });\n }\n\n /**\n * Whether any alias was declared.\n *\n * @returns {boolean} True when at least one alias is known\n *\n * @example\n * aliases.isEmpty();\n */\n isEmpty() {\n return this.byUri.size === 0;\n }\n\n /**\n * Apply aliasing to a literal result name.\n *\n * @param {string|null} namespaceUri - The namespace of the stylesheet node\n * @param {string} localName - The local name of the stylesheet node\n * @returns {{namespaceUri: (string|null), qname: string}|null} The aliased name, or null when no alias applies\n *\n * @example\n * aliases.resolve('http://www.w3.org/1999/XSL/TransformAlias', 'stylesheet');\n * // { namespaceUri: 'http://www.w3.org/1999/XSL/Transform', qname: 'xsl:stylesheet' }\n */\n resolve(namespaceUri, localName) {\n const alias = namespaceUri ? this.byUri.get(namespaceUri) : undefined;\n if (!alias) return null;\n\n return {\n namespaceUri: alias.uri,\n qname: alias.prefix ? `${alias.prefix}:${localName}` : localName,\n };\n }\n}\n\n/**\n * Whether an attribute of a literal result element is copied to the output.\n *\n * Namespace declarations are re-created from the element namespaces themselves,\n * and every XSLT attribute (`xsl:use-attribute-sets`, `xsl:version`,\n * `xsl:exclude-result-prefixes`, `xsl:extension-element-prefixes`) is an\n * instruction to the processor rather than result tree content.\n *\n * @param {Attr} attribute - The attribute of the stylesheet element\n * @param {string} xsltNamespace - The XSLT namespace URI\n * @returns {boolean} True when the attribute belongs in the result\n *\n * @example\n * shouldCopyAttribute(attr, 'http://www.w3.org/1999/XSL/Transform');\n */\nexport function shouldCopyAttribute(attribute, xsltNamespace) {\n if (attribute.namespaceURI === xsltNamespace) return false;\n if (attribute.name === \"xmlns\" || attribute.name.startsWith(\"xmlns:\")) {\n return false;\n }\n return !attribute.name.startsWith(\"xsl:\");\n}\n\n/**\n * Read an XSLT attribute from a literal result element.\n *\n * Works both for namespace aware DOMs and for documents where the attribute is\n * only known by its `xsl:` qualified name.\n *\n * @param {Element} node - The literal result element\n * @param {string} localName - The XSLT attribute local name\n * @param {string} xsltNamespace - The XSLT namespace URI\n * @returns {string|null} The attribute value, or null when absent\n *\n * @example\n * getXsltAttribute(element, 'use-attribute-sets', XSLT_NS);\n */\nexport function getXsltAttribute(node, localName, xsltNamespace) {\n if (!node.attributes) return null;\n\n for (const attribute of node.attributes) {\n const matchesNamespace =\n attribute.namespaceURI === xsltNamespace &&\n (attribute.localName || attribute.name) === localName;\n if (matchesNamespace || attribute.name === `xsl:${localName}`) {\n return attribute.value;\n }\n }\n\n return null;\n}\n", "/**\n * Result tree construction helpers.\n *\n * XSLT builds its result tree in a neutral XML document: building directly in\n * an HTML owner document would lower case element names and force the XHTML\n * namespace on every created element. The finished tree is imported into the\n * caller's document only at the very end, which keeps names, namespaces and the\n * `disable-output-escaping` markers intact.\n */\n\n\"use strict\";\n\n/**\n * Create an empty, namespace neutral XML document.\n *\n * @param {Document} ownerDocument - Any document, used for its DOM implementation\n * @returns {Document} A fresh empty XML document\n *\n * @example\n * const resultDoc = createResultDocument(window.document);\n */\nexport function createResultDocument(ownerDocument) {\n return ownerDocument.implementation.createDocument(null, null, null);\n}\n\n/**\n * Deep-import a result tree node into another document.\n *\n * Unlike `Document.importNode` this preserves the internal\n * `_disableOutputEscaping` marker set by `disable-output-escaping`.\n *\n * @param {Node} node - The node to import\n * @param {Document} targetDoc - The document that will own the copy\n * @returns {Node} The imported copy\n *\n * @example\n * const copy = importResultNode(element, window.document);\n */\nexport function importResultNode(node, targetDoc) {\n const copy = targetDoc.importNode(node, false);\n\n if (node._disableOutputEscaping) {\n copy._disableOutputEscaping = true;\n }\n\n if (node.childNodes) {\n for (const child of node.childNodes) {\n copy.appendChild(importResultNode(child, targetDoc));\n }\n }\n\n return copy;\n}\n\n/**\n * Move a finished result fragment into the caller's output document.\n *\n * @param {DocumentFragment} fragment - The fragment built in the neutral document\n * @param {Document} targetDoc - The document that will own the result\n * @returns {DocumentFragment} A fragment owned by `targetDoc`\n *\n * @example\n * const result = importResultFragment(fragment, window.document);\n */\nexport function importResultFragment(fragment, targetDoc) {\n if (fragment.ownerDocument === targetDoc) return fragment;\n\n const imported = targetDoc.createDocumentFragment();\n for (const child of fragment.childNodes) {\n imported.appendChild(importResultNode(child, targetDoc));\n }\n\n return imported;\n}\n", "/**\n * Default template priorities (XSLT 1.0 section 5.5).\n *\n * A template rule without an explicit `priority` attribute gets a default\n * priority derived from the shape of its match pattern. A union pattern is\n * treated as a set of template rules, one per alternative, so each\n * alternative must be assigned its own priority by the caller.\n *\n * @module xslt/templatePriority\n */\n\nconst NAME = String.raw`[A-Za-z_][\\w.-]*`;\nconst QNAME = `(?:${NAME}:)?${NAME}`;\n\n/** Patterns of the form `name`, `prefix:name`, `@name`, `@prefix:name`. */\nconst QNAME_PATTERN = new RegExp(`^(?:child::|attribute::|@)?${QNAME}$`);\n\n/** Patterns of the form `prefix:*` or `@prefix:*`. */\nconst PREFIX_WILDCARD_PATTERN = new RegExp(\n String.raw`^(?:child::|attribute::|@)?${NAME}:\\*$`,\n);\n\n/** Patterns of the form `*`, `@*`, `node()`, `text()`, `comment()`, `processing-instruction()`. */\nconst NODE_TEST_PATTERN =\n /^(?:child::|attribute::|@)?(?:\\*|node\\(\\)|text\\(\\)|comment\\(\\)|processing-instruction\\(\\))$/;\n\n/** `processing-instruction('literal')` patterns. */\nconst PI_LITERAL_PATTERN =\n /^(?:child::)?processing-instruction\\(\\s*(?:\"[^\"]*\"|'[^']*')\\s*\\)$/;\n\n/**\n * Compute the default priority of a single (non-union) match pattern.\n *\n * @param {string|null|undefined} pattern - The match pattern, already trimmed\n * @returns {number} -0.5, -0.25, 0 or 0.5 as defined by the specification\n */\nexport function calculatePriority(pattern) {\n if (!pattern) return 0.5;\n\n if (NODE_TEST_PATTERN.test(pattern)) return -0.5;\n if (PREFIX_WILDCARD_PATTERN.test(pattern)) return -0.25;\n if (QNAME_PATTERN.test(pattern) || PI_LITERAL_PATTERN.test(pattern)) return 0;\n\n return 0.5;\n}\n", "/**\n * Serializer Constants\n *\n * Shared node type codes, namespace URIs and HTML element tables used by the\n * XSLT 1.0 output serializers (XSLT 1.0 section 16).\n */\n\n/**\n * DOM node type codes used by the serializers.\n */\nexport const NODE_TYPE = {\n ELEMENT: 1,\n TEXT: 3,\n CDATA_SECTION: 4,\n PROCESSING_INSTRUCTION: 7,\n COMMENT: 8,\n DOCUMENT: 9,\n DOCUMENT_FRAGMENT: 11,\n};\n\n/**\n * Namespace URI reserved for namespace declaration attributes.\n */\nexport const XMLNS_NAMESPACE = \"http://www.w3.org/2000/xmlns/\";\n\n/**\n * Namespace URI bound to the reserved `xml` prefix.\n */\nexport const XML_NAMESPACE = \"http://www.w3.org/XML/1998/namespace\";\n\n/**\n * How the text children of an element have to be written out.\n */\nexport const TEXT_MODE = {\n ESCAPE: \"escape\",\n CDATA: \"cdata\",\n RAW: \"raw\",\n};\n\n/**\n * HTML elements that never have an end tag.\n */\nexport const VOID_ELEMENTS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\n/**\n * HTML elements whose character data must not be escaped.\n */\nexport const RAW_TEXT_ELEMENTS = new Set([\"script\", \"style\"]);\n\n/**\n * HTML elements whose content must never be re-indented.\n */\nexport const PRESERVE_SPACE_ELEMENTS = new Set([\n \"pre\",\n \"script\",\n \"style\",\n \"textarea\",\n]);\n\n/**\n * Indentation unit used when `indent=\"yes\"` is requested.\n */\nexport const INDENT_UNIT = \" \";\n", "/**\n * Output Settings Resolution\n *\n * Normalizes the `xsl:output` settings collected by the XSLT engine into the\n * shape the serializers consume (XSLT 1.0 section 16).\n */\n\nimport { NODE_TYPE } from \"./constants.js\";\n\n/**\n * Test whether an `xsl:output` yes/no attribute is enabled.\n *\n * @param {string|boolean|undefined} value - Raw attribute value\n * @returns {boolean} True when the value means \"yes\"\n */\nfunction isYes(value) {\n return value === true || String(value).toLowerCase() === \"yes\";\n}\n\n/**\n * Convert a `cdata-section-elements` value into a lookup set.\n *\n * @param {string|string[]|undefined} value - Whitespace separated names or array\n * @returns {Set<string>} Element names requiring CDATA sections\n */\nfunction toNameSet(value) {\n if (Array.isArray(value)) {\n return new Set(value);\n }\n if (typeof value === \"string\") {\n return new Set(value.split(/\\s+/).filter(Boolean));\n }\n return new Set();\n}\n\n/**\n * Find the first element node of a result tree.\n *\n * @param {Node|null} node - Document, fragment or element\n * @returns {Element|null} The result document element, when there is one\n */\nexport function findRootElement(node) {\n if (!node) {\n return null;\n }\n if (node.nodeType === NODE_TYPE.ELEMENT) {\n return node;\n }\n for (const child of node.childNodes || []) {\n if (child.nodeType === NODE_TYPE.ELEMENT) {\n return child;\n }\n }\n return null;\n}\n\n/**\n * Derive the default output method from the result tree.\n *\n * XSLT 1.0 section 16 defaults to `html` when the document element is `html`\n * in no namespace, and to `xml` otherwise.\n *\n * @param {Node|null} node - Result tree root\n * @returns {string} Either \"html\" or \"xml\"\n */\nexport function detectOutputMethod(node) {\n const root = findRootElement(node);\n const isHtmlRoot =\n root && !root.namespaceURI && root.localName.toLowerCase() === \"html\";\n return isHtmlRoot ? \"html\" : \"xml\";\n}\n\n/**\n * Normalize an `xsl:output` settings object.\n *\n * An absent, empty or \"auto\" method triggers the XSLT 1.0 default method\n * detection based on the result tree.\n *\n * @param {object|null} outputSettings - Raw settings from the XSLT engine\n * @param {Node|null} node - Result tree used for default method detection\n * @returns {object} Normalized settings consumed by the serializers\n */\nexport function resolveOutputSettings(outputSettings, node) {\n const raw = outputSettings || {};\n const declared = typeof raw.method === \"string\" ? raw.method.trim() : \"\";\n const method =\n declared && declared !== \"auto\"\n ? declared.toLowerCase()\n : detectOutputMethod(node);\n\n return {\n method,\n version: raw.version || \"1.0\",\n encoding: raw.encoding || \"UTF-8\",\n standalone: raw.standalone || null,\n indent: isYes(raw.indent),\n omitXmlDeclaration: isYes(raw.omitXmlDeclaration),\n doctypePublic: raw.doctypePublic || null,\n doctypeSystem: raw.doctypeSystem || null,\n mediaType: raw.mediaType || null,\n cdataSectionElements: toNameSet(raw.cdataSectionElements),\n };\n}\n", "/**\n * Output Escaping Helpers\n *\n * Character escaping rules for the xml, xhtml and html output methods\n * (XSLT 1.0 section 16).\n */\n\nconst XML_TEXT_ESCAPES = { \"&\": \"&\", \"<\": \"<\" };\n\nconst HTML_TEXT_ESCAPES = { \"&\": \"&\", \"<\": \"<\", \">\": \">\" };\n\nconst XML_ATTRIBUTE_ESCAPES = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"\\t\": \"	\",\n \"\\n\": \" \",\n \"\\r\": \" \",\n};\n\nconst HTML_ATTRIBUTE_ESCAPES = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n};\n\n/**\n * Replace every character matched by a pattern using a lookup table.\n *\n * @param {string} value - Text to escape\n * @param {RegExp} pattern - Global pattern selecting the characters to replace\n * @param {Record<string, string>} escapes - Character to replacement mapping\n * @returns {string} Escaped text\n */\nfunction escapeWith(value, pattern, escapes) {\n return String(value).replaceAll(pattern, (character) => escapes[character]);\n}\n\n/**\n * Escape character data for the xml output method.\n *\n * `>` is only escaped where it would close a CDATA section, matching the\n * \"minimal escaping\" rule of XSLT 1.0 section 16.1.\n *\n * @param {string} value - Text content\n * @returns {string} Escaped text\n */\nexport function escapeXmlText(value) {\n return escapeWith(value, /[&<]/g, XML_TEXT_ESCAPES).replaceAll(\n \"]]>\",\n \"]]>\",\n );\n}\n\n/**\n * Escape an attribute value for the xml output method.\n *\n * @param {string} value - Attribute value\n * @returns {string} Escaped value\n */\nexport function escapeXmlAttribute(value) {\n return escapeWith(value, /[&<>\"\\t\\n\\r]/g, XML_ATTRIBUTE_ESCAPES);\n}\n\n/**\n * Escape character data for the html output method.\n *\n * @param {string} value - Text content\n * @returns {string} Escaped text\n */\nexport function escapeHtmlText(value) {\n return escapeWith(value, /[&<>]/g, HTML_TEXT_ESCAPES);\n}\n\n/**\n * Escape an attribute value for the html output method.\n *\n * URI attributes keep their reserved characters; only markup significant\n * characters are escaped (XSLT 1.0 section 16.2).\n *\n * @param {string} value - Attribute value\n * @returns {string} Escaped value\n */\nexport function escapeHtmlAttribute(value) {\n return escapeWith(value, /[&<>\"]/g, HTML_ATTRIBUTE_ESCAPES);\n}\n\n/**\n * Wrap text in a CDATA section, splitting it around any `]]>` terminator.\n *\n * @param {string} value - Text content\n * @returns {string} One or more CDATA sections\n */\nexport function wrapCdata(value) {\n return `<![CDATA[${String(value).replaceAll(\"]]>\", \"]]]]><![CDATA[>\")}]]>`;\n}\n", "/**\n * Namespace Declaration Tracking\n *\n * Computes the `xmlns` declarations an element has to carry so that every\n * namespace is declared where it is first used and never twice.\n */\n\nimport { XMLNS_NAMESPACE, XML_NAMESPACE } from \"./constants.js\";\n\n/**\n * Create the namespace scope in effect above the result tree root.\n *\n * @returns {Map<string, string>} Prefix (empty string for the default) to URI\n */\nexport function createNamespaceScope() {\n return new Map([\n [\"\", \"\"],\n [\"xml\", XML_NAMESPACE],\n ]);\n}\n\n/**\n * Collect the namespace declarations an element must emit.\n *\n * @param {Element} element - Element being serialized\n * @param {Map<string, string>} scope - Namespace scope inherited from the parent\n * @returns {{declarations: Array<{prefix: string, uri: string}>, scope: Map<string, string>}}\n * The declarations to write and the scope in effect for the children\n */\nexport function collectNamespaceDeclarations(element, scope) {\n const declarations = [];\n let next = scope;\n\n /**\n * Record a declaration when the binding is not already in scope.\n * @param {string} prefix - Namespace prefix, empty for the default namespace\n * @param {string} uri - Namespace URI\n * @returns {void}\n */\n const declare = (prefix, uri) => {\n if (next.get(prefix) === uri) {\n return;\n }\n if (next === scope) {\n next = new Map(scope);\n }\n next.set(prefix, uri);\n declarations.push({ prefix, uri });\n };\n\n declare(element.prefix || \"\", element.namespaceURI || \"\");\n\n const attributes = Array.from(element.attributes || []);\n\n for (const attribute of attributes) {\n if (attribute.namespaceURI !== XMLNS_NAMESPACE && attribute.prefix) {\n declare(attribute.prefix, attribute.namespaceURI || \"\");\n }\n }\n\n for (const attribute of attributes) {\n if (attribute.namespaceURI === XMLNS_NAMESPACE) {\n declare(attribute.prefix ? attribute.localName : \"\", attribute.value);\n }\n }\n\n return { declarations, scope: next };\n}\n", "/**\n * Indentation Rules\n *\n * Decides which elements may be pretty printed when `indent=\"yes\"` is set.\n * Only element-only content is indented; mixed content is left untouched so\n * that the transformation result stays character-for-character faithful.\n */\n\nimport { NODE_TYPE } from \"./constants.js\";\n\n/**\n * Test whether a character data node holds only whitespace.\n *\n * @param {Node} node - Text node to test\n * @returns {boolean} True when the node contains no non-whitespace character\n */\nexport function isWhitespaceOnlyText(node) {\n return !/\\S/.test(node.nodeValue || \"\");\n}\n\n/**\n * Collect the children to write when indenting an element.\n *\n * @param {Element} element - Element whose children are inspected\n * @returns {Node[]|null} Children to indent, or null when the element must be\n * serialized without any added whitespace\n */\nexport function getIndentableChildren(element) {\n const indentable = [];\n\n for (const child of element.childNodes) {\n if (child.nodeType === NODE_TYPE.TEXT) {\n if (isWhitespaceOnlyText(child)) {\n continue;\n }\n return null;\n }\n\n if (\n child.nodeType !== NODE_TYPE.ELEMENT &&\n child.nodeType !== NODE_TYPE.COMMENT &&\n child.nodeType !== NODE_TYPE.PROCESSING_INSTRUCTION\n ) {\n return null;\n }\n\n indentable.push(child);\n }\n\n return indentable.length > 0 ? indentable : null;\n}\n", "/**\n * Raw Text Registry\n *\n * Tracks the text nodes produced with `disable-output-escaping=\"yes\"`\n * (XSLT 1.0 section 16.4) so the serializers can emit them verbatim.\n */\n\n/**\n * Text nodes whose content must be written without escaping.\n * @type {WeakSet<Node>}\n */\nexport const rawTextNodes = new WeakSet();\n\n/**\n * Mark a text node as produced with `disable-output-escaping=\"yes\"`.\n *\n * @param {Node|null} node - Text node to mark\n * @returns {Node|null} The same node, for chaining\n */\nexport function markRawText(node) {\n if (node) {\n rawTextNodes.add(node);\n }\n return node;\n}\n\n/**\n * Check whether a node must be serialized without output escaping.\n *\n * Both the registry and the legacy `_disableOutputEscaping` flag set by the\n * XSLT engine are honored so that either marking mechanism works.\n *\n * @param {Node|null} node - Node to test\n * @returns {boolean} True when the node content must be emitted raw\n */\nexport function isRawText(node) {\n if (!node) {\n return false;\n }\n return rawTextNodes.has(node) || node._disableOutputEscaping === true;\n}\n", "/**\n * Result Tree Writer\n *\n * Walks a result tree and turns it into markup. Everything that differs\n * between the xml, xhtml and html output methods of XSLT 1.0 section 16 is\n * delegated to the dialect hooks implemented by the concrete writers.\n */\n\nimport {\n INDENT_UNIT,\n NODE_TYPE,\n TEXT_MODE,\n XMLNS_NAMESPACE,\n} from \"./constants.js\";\nimport { wrapCdata } from \"./escape.js\";\nimport {\n collectNamespaceDeclarations,\n createNamespaceScope,\n} from \"./namespaces.js\";\nimport { getIndentableChildren } from \"./indent.js\";\nimport { isRawText } from \"./rawText.js\";\nimport { findRootElement } from \"./settings.js\";\n\nexport class BaseWriter {\n /**\n * @param {object} settings - Normalized output settings\n * @param {{xhtml?: boolean}} [options] - Dialect options\n */\n constructor(settings, options = {}) {\n this.settings = settings;\n this.xhtml = options.xhtml === true;\n this.parts = [];\n }\n\n /**\n * Serialize a result tree node.\n *\n * @param {Node} node - Document, fragment or element to serialize\n * @returns {string} Serialized output\n */\n serialize(node) {\n this.parts = [];\n this.writeProlog(node);\n this.writeNode(node, createNamespaceScope(), 0, TEXT_MODE.ESCAPE);\n return this.parts.join(\"\");\n }\n\n /**\n * Write the XML declaration and the document type declaration.\n *\n * @param {Node} node - Result tree root\n * @returns {void}\n */\n writeProlog(node) {\n if (this.emitsXmlDeclaration) {\n const { version, encoding, standalone } = this.settings;\n const standalonePart = standalone ? ` standalone=\"${standalone}\"` : \"\";\n this.parts.push(\n `<?xml version=\"${version}\" encoding=\"${encoding}\"${standalonePart}?>\\n`,\n );\n }\n\n const doctype = this.doctypeMarkup(findRootElement(node));\n if (doctype) {\n this.parts.push(`${doctype}\\n`);\n }\n }\n\n /**\n * Write any result tree node.\n *\n * @param {Node} node - Node to write\n * @param {Map<string, string>} scope - Namespace scope in effect\n * @param {number} depth - Current indentation depth\n * @param {string} textMode - {@link TEXT_MODE} for character data children\n * @returns {void}\n */\n writeNode(node, scope, depth, textMode) {\n switch (node.nodeType) {\n case NODE_TYPE.ELEMENT:\n this.writeElement(node, scope, depth);\n break;\n case NODE_TYPE.TEXT:\n case NODE_TYPE.CDATA_SECTION:\n this.writeText(node, textMode);\n break;\n case NODE_TYPE.COMMENT:\n this.parts.push(`<!--${node.nodeValue}-->`);\n break;\n case NODE_TYPE.PROCESSING_INSTRUCTION:\n this.writeProcessingInstruction(node);\n break;\n case NODE_TYPE.DOCUMENT:\n case NODE_TYPE.DOCUMENT_FRAGMENT:\n this.writeChildNodes(node, scope, depth, textMode);\n break;\n default:\n break;\n }\n }\n\n /**\n * Write every child of a node without adding whitespace.\n *\n * @param {Node} node - Parent node\n * @param {Map<string, string>} scope - Namespace scope in effect\n * @param {number} depth - Current indentation depth\n * @param {string} textMode - {@link TEXT_MODE} for character data children\n * @returns {void}\n */\n writeChildNodes(node, scope, depth, textMode) {\n for (const child of node.childNodes) {\n this.writeNode(child, scope, depth, textMode);\n }\n }\n\n /**\n * Write an element with its namespaces, attributes and children.\n *\n * @param {Element} element - Element to write\n * @param {Map<string, string>} scope - Namespace scope inherited from the parent\n * @param {number} depth - Current indentation depth\n * @returns {void}\n */\n writeElement(element, scope, depth) {\n const namespaces = this.emitsNamespaces\n ? collectNamespaceDeclarations(element, scope)\n : { declarations: [], scope };\n const name = element.nodeName;\n\n this.parts.push(\n `<${name}${this.namespaceMarkup(namespaces.declarations)}` +\n this.attributesMarkup(element),\n );\n\n if (!element.firstChild) {\n this.parts.push(this.emptyElementMarkup(element, name));\n return;\n }\n\n this.parts.push(\">\");\n this.writeElementChildren(element, namespaces.scope, depth);\n this.parts.push(`</${name}>`);\n }\n\n /**\n * Write the children of an element, indenting element-only content.\n *\n * @param {Element} element - Parent element\n * @param {Map<string, string>} scope - Namespace scope in effect\n * @param {number} depth - Depth of the parent element\n * @returns {void}\n */\n writeElementChildren(element, scope, depth) {\n const textMode = this.childTextMode(element);\n const indentable = this.indentableChildren(element, textMode);\n\n if (!indentable) {\n this.writeChildNodes(element, scope, depth, textMode);\n return;\n }\n\n const childIndent = `\\n${INDENT_UNIT.repeat(depth + 1)}`;\n for (const child of indentable) {\n this.parts.push(childIndent);\n this.writeNode(child, scope, depth + 1, textMode);\n }\n this.parts.push(`\\n${INDENT_UNIT.repeat(depth)}`);\n }\n\n /**\n * Determine the children to indent inside an element.\n *\n * @param {Element} element - Parent element\n * @param {string} textMode - {@link TEXT_MODE} for character data children\n * @returns {Node[]|null} Children to indent, or null when indenting is off\n */\n indentableChildren(element, textMode) {\n if (!this.settings.indent || textMode !== TEXT_MODE.ESCAPE) {\n return null;\n }\n if (!this.allowsIndentInside(element)) {\n return null;\n }\n return getIndentableChildren(element);\n }\n\n /**\n * Build the namespace declaration markup of an element.\n *\n * @param {Array<{prefix: string, uri: string}>} declarations - Declarations\n * @returns {string} Attribute markup, starting with a space when non-empty\n */\n namespaceMarkup(declarations) {\n return declarations\n .map(({ prefix, uri }) => {\n const name = prefix ? `xmlns:${prefix}` : \"xmlns\";\n return ` ${name}=\"${this.escapeAttribute(uri)}\"`;\n })\n .join(\"\");\n }\n\n /**\n * Build the attribute markup of an element, skipping namespace declarations.\n *\n * @param {Element} element - Element being written\n * @returns {string} Attribute markup, starting with a space when non-empty\n */\n attributesMarkup(element) {\n let markup = \"\";\n for (const attribute of Array.from(element.attributes || [])) {\n if (attribute.namespaceURI !== XMLNS_NAMESPACE) {\n markup += this.attributeMarkup(attribute);\n }\n }\n return markup;\n }\n\n /**\n * Build the markup of a single attribute.\n *\n * @param {Attr} attribute - Attribute to write\n * @returns {string} Attribute markup, starting with a space\n */\n attributeMarkup(attribute) {\n return ` ${attribute.name}=\"${this.escapeAttribute(attribute.value)}\"`;\n }\n\n /**\n * Write a character data node.\n *\n * Nodes produced with `disable-output-escaping=\"yes\"` are written verbatim.\n *\n * @param {Node} node - Text or CDATA section node\n * @param {string} textMode - {@link TEXT_MODE} requested by the parent\n * @returns {void}\n */\n writeText(node, textMode) {\n const value = node.nodeValue || \"\";\n\n if (isRawText(node)) {\n this.parts.push(value);\n return;\n }\n\n const mode = this.resolveTextMode(node, textMode);\n if (mode === TEXT_MODE.CDATA) {\n this.parts.push(wrapCdata(value));\n } else if (mode === TEXT_MODE.RAW) {\n this.parts.push(value);\n } else {\n this.parts.push(this.escapeText(value));\n }\n }\n\n /**\n * Resolve the effective text mode of a character data node.\n *\n * @param {Node} node - Text or CDATA section node\n * @param {string} textMode - {@link TEXT_MODE} requested by the parent\n * @returns {string} A {@link TEXT_MODE} value\n */\n resolveTextMode(node, textMode) {\n if (textMode !== TEXT_MODE.ESCAPE) {\n return textMode;\n }\n return node.nodeType === NODE_TYPE.CDATA_SECTION\n ? this.cdataNodeMode\n : TEXT_MODE.ESCAPE;\n }\n\n /**\n * Write a processing instruction node.\n *\n * @param {ProcessingInstruction} node - Node to write\n * @returns {void}\n */\n writeProcessingInstruction(node) {\n const data = node.nodeValue || \"\";\n const separator = data ? \" \" : \"\";\n this.parts.push(`<?${node.target}${separator}${data}${this.piTerminator}`);\n }\n}\n", "/**\n * XML Output Serializer\n *\n * Implements the `xml` output method of XSLT 1.0 section 16.1 and, with the\n * `xhtml` option, the XHTML empty element convention. It is also the base of\n * the html serializer, which overrides the dialect hooks defined here.\n */\n\nimport { TEXT_MODE, VOID_ELEMENTS } from \"./constants.js\";\nimport { escapeXmlAttribute, escapeXmlText } from \"./escape.js\";\nimport { BaseWriter } from \"./baseWriter.js\";\n\nexport class XmlWriter extends BaseWriter {\n /**\n * Whether an XML declaration has to be written.\n * @returns {boolean} True when the declaration is not omitted\n */\n get emitsXmlDeclaration() {\n return !this.settings.omitXmlDeclaration;\n }\n\n /**\n * Whether namespace declarations have to be written.\n * @returns {boolean} Always true for XML output\n */\n get emitsNamespaces() {\n return true;\n }\n\n /**\n * Terminator of a processing instruction.\n * @returns {string} The XML processing instruction terminator\n */\n get piTerminator() {\n return \"?>\";\n }\n\n /**\n * How a source CDATA section node has to be written.\n * @returns {string} A {@link TEXT_MODE} value\n */\n get cdataNodeMode() {\n return TEXT_MODE.CDATA;\n }\n\n /**\n * Build the document type declaration for the xml output method.\n *\n * @param {Element|null} rootElement - Result document element\n * @returns {string} Doctype markup, or an empty string when not applicable\n */\n doctypeMarkup(rootElement) {\n const { doctypePublic, doctypeSystem } = this.settings;\n if (!rootElement || !doctypeSystem) {\n return \"\";\n }\n\n const name = rootElement.nodeName;\n return doctypePublic\n ? `<!DOCTYPE ${name} PUBLIC \"${doctypePublic}\" \"${doctypeSystem}\">`\n : `<!DOCTYPE ${name} SYSTEM \"${doctypeSystem}\">`;\n }\n\n /**\n * Determine how the character data children of an element are written.\n *\n * @param {Element} element - Parent element\n * @returns {string} A {@link TEXT_MODE} value\n */\n childTextMode(element) {\n const names = this.settings.cdataSectionElements;\n return names.has(element.nodeName) || names.has(element.localName)\n ? TEXT_MODE.CDATA\n : TEXT_MODE.ESCAPE;\n }\n\n /**\n * Whether the content of an element may be re-indented.\n *\n * @param {Element} _element - Element being inspected\n * @returns {boolean} Always true for XML output\n */\n allowsIndentInside(_element) {\n return true;\n }\n\n /**\n * Build the markup closing an element that has no children.\n *\n * @param {Element} element - Empty element\n * @param {string} _name - Element name as written\n * @returns {string} Markup terminating the start tag\n */\n emptyElementMarkup(element, _name) {\n return this.xhtml && this.isVoidElement(element) ? \" />\" : \"/>\";\n }\n\n /**\n * Test whether an element is an HTML void element.\n *\n * @param {Element} element - Element to test\n * @returns {boolean} True for void elements such as `br`\n */\n isVoidElement(element) {\n return VOID_ELEMENTS.has(String(element.localName).toLowerCase());\n }\n\n /**\n * Escape character data.\n *\n * @param {string} value - Text content\n * @returns {string} Escaped text\n */\n escapeText(value) {\n return escapeXmlText(value);\n }\n\n /**\n * Escape an attribute value.\n *\n * @param {string} value - Attribute value\n * @returns {string} Escaped value\n */\n escapeAttribute(value) {\n return escapeXmlAttribute(value);\n }\n}\n", "/**\n * HTML Output Serializer\n *\n * Implements the `html` output method of XSLT 1.0 section 16.2 on top of the\n * XML writer: no XML declaration, no namespace declarations, void elements\n * without a closing slash, minimized boolean attributes and unescaped\n * script/style content.\n */\n\nimport {\n PRESERVE_SPACE_ELEMENTS,\n RAW_TEXT_ELEMENTS,\n TEXT_MODE,\n} from \"./constants.js\";\nimport { escapeHtmlAttribute, escapeHtmlText } from \"./escape.js\";\nimport { XmlWriter } from \"./xmlSerializer.js\";\n\nexport class HtmlWriter extends XmlWriter {\n /**\n * The html output method never writes an XML declaration.\n * @returns {boolean} Always false\n */\n get emitsXmlDeclaration() {\n return false;\n }\n\n /**\n * The html output method never writes namespace declarations.\n * @returns {boolean} Always false\n */\n get emitsNamespaces() {\n return false;\n }\n\n /**\n * HTML processing instructions are terminated by `>` alone.\n * @returns {string} The HTML processing instruction terminator\n */\n get piTerminator() {\n return \">\";\n }\n\n /**\n * HTML has no CDATA sections, so such nodes are escaped as text.\n * @returns {string} A {@link TEXT_MODE} value\n */\n get cdataNodeMode() {\n return TEXT_MODE.ESCAPE;\n }\n\n /**\n * Build the document type declaration for the html output method.\n *\n * @param {Element|null} rootElement - Result document element\n * @returns {string} Doctype markup, or an empty string when not applicable\n */\n doctypeMarkup(rootElement) {\n const { doctypePublic, doctypeSystem } = this.settings;\n if (!doctypePublic && !doctypeSystem) {\n return \"\";\n }\n\n const name = rootElement ? rootElement.nodeName : \"html\";\n if (doctypePublic && doctypeSystem) {\n return `<!DOCTYPE ${name} PUBLIC \"${doctypePublic}\" \"${doctypeSystem}\">`;\n }\n if (doctypePublic) {\n return `<!DOCTYPE ${name} PUBLIC \"${doctypePublic}\">`;\n }\n return `<!DOCTYPE ${name} SYSTEM \"${doctypeSystem}\">`;\n }\n\n /**\n * Script and style content is written verbatim.\n *\n * @param {Element} element - Parent element\n * @returns {string} A {@link TEXT_MODE} value\n */\n childTextMode(element) {\n return RAW_TEXT_ELEMENTS.has(String(element.localName).toLowerCase())\n ? TEXT_MODE.RAW\n : TEXT_MODE.ESCAPE;\n }\n\n /**\n * Content of `pre`, `script`, `style` and `textarea` is never re-indented.\n *\n * @param {Element} element - Element being inspected\n * @returns {boolean} True when the content may be indented\n */\n allowsIndentInside(element) {\n return !PRESERVE_SPACE_ELEMENTS.has(\n String(element.localName).toLowerCase(),\n );\n }\n\n /**\n * Void elements have no end tag; every other element gets one.\n *\n * @param {Element} element - Empty element\n * @param {string} name - Element name as written\n * @returns {string} Markup terminating the start tag\n */\n emptyElementMarkup(element, name) {\n return this.isVoidElement(element) ? \">\" : `></${name}>`;\n }\n\n /**\n * Boolean attributes are minimized to their name alone.\n *\n * @param {Attr} attribute - Attribute to write\n * @returns {string} Attribute markup, starting with a space\n */\n attributeMarkup(attribute) {\n const { name, value } = attribute;\n if (String(value).toLowerCase() === name.toLowerCase()) {\n return ` ${name}`;\n }\n return ` ${name}=\"${this.escapeAttribute(value)}\"`;\n }\n\n /**\n * Escape character data for HTML.\n *\n * @param {string} value - Text content\n * @returns {string} Escaped text\n */\n escapeText(value) {\n return escapeHtmlText(value);\n }\n\n /**\n * Escape an attribute value for HTML.\n *\n * @param {string} value - Attribute value\n * @returns {string} Escaped value\n */\n escapeAttribute(value) {\n return escapeHtmlAttribute(value);\n }\n}\n", "/**\n * Text Output Serializer\n *\n * Implements the `text` output method of XSLT 1.0 section 16.3: the result is\n * the concatenation of every descendant character data node, unescaped.\n */\n\nimport { NODE_TYPE } from \"./constants.js\";\n\n/**\n * Serialize a result tree with the text output method.\n *\n * @param {Node} node - Document, fragment, element or character data node\n * @returns {string} Concatenated character data\n */\nexport function serializeText(node) {\n if (\n node.nodeType === NODE_TYPE.TEXT ||\n node.nodeType === NODE_TYPE.CDATA_SECTION\n ) {\n return node.nodeValue || \"\";\n }\n\n let text = \"\";\n for (const child of node.childNodes || []) {\n text += serializeText(child);\n }\n return text;\n}\n", "/**\n * XSLT Output Serializer\n *\n * Serializes a result tree to a string honoring the `xsl:output` settings of\n * the stylesheet (XSLT 1.0 section 16): output method, indentation, XML\n * declaration, document type declaration, CDATA sections and\n * `disable-output-escaping`.\n *\n * @example\n * import { serializeResult } from './serializer.js';\n *\n * serializeResult(resultDocument, { method: 'xml', indent: 'yes' });\n * // '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<BAR>\\n <QUX/>\\n</BAR>'\n */\n\nimport { resolveOutputSettings } from \"./serializer/settings.js\";\nimport { XmlWriter } from \"./serializer/xmlSerializer.js\";\nimport { HtmlWriter } from \"./serializer/htmlSerializer.js\";\nimport { serializeText } from \"./serializer/textSerializer.js\";\n\nexport { markRawText, isRawText, rawTextNodes } from \"./serializer/rawText.js\";\nexport {\n resolveOutputSettings,\n detectOutputMethod,\n findRootElement,\n} from \"./serializer/settings.js\";\nexport { XmlWriter } from \"./serializer/xmlSerializer.js\";\nexport { HtmlWriter } from \"./serializer/htmlSerializer.js\";\nexport { serializeText } from \"./serializer/textSerializer.js\";\n\n/**\n * Serialize a transformation result to a string.\n *\n * @param {Node|null} node - Result document, fragment or element\n * @param {object} [outputSettings] - `xsl:output` settings, as collected by the\n * XSLT engine (`method`, `version`, `encoding`, `standalone`, `indent`,\n * `omitXmlDeclaration`, `doctypePublic`, `doctypeSystem`, `mediaType`,\n * `cdataSectionElements`)\n * @returns {string} The serialized result, or an empty string for a null node\n */\nexport function serializeResult(node, outputSettings = {}) {\n if (!node) {\n return \"\";\n }\n\n const settings = resolveOutputSettings(outputSettings, node);\n\n if (settings.method === \"text\") {\n return serializeText(node);\n }\n if (settings.method === \"html\") {\n return new HtmlWriter(settings).serialize(node);\n }\n return new XmlWriter(settings, {\n xhtml: settings.method === \"xhtml\",\n }).serialize(node);\n}\n", "/**\n * XSLT 1.0 Processing Engine\n * Based on W3C XSLT 1.0 Specification: http://www.w3.org/TR/1999/REC-xslt-19991116\n *\n * Processes XSLT stylesheets and transforms XML documents.\n */\n\nimport { parse as parseXPath } from \"../xpath/parser.js\";\nimport { XPathEvaluator, XPathContext } from \"../xpath/evaluator.js\";\nimport { XSLT_NAMESPACE } from \"./elements.js\";\nimport { createXsltFunctions } from \"./functions.js\";\nimport { KeyIndexRegistry } from \"./keys.js\";\nimport { countXsltNumber } from \"./number.js\";\nimport { formatXsltNumber, toRoman } from \"./numberFormat.js\";\nimport { resolveUri, stripFragment } from \"./uri.js\";\nimport { WhitespaceFilter, stripWhitespaceNodes } from \"./whitespace.js\";\nimport {\n NamespaceAliasMap,\n getXsltAttribute,\n shouldCopyAttribute,\n} from \"./literalResult.js\";\nimport { createResultDocument, importResultFragment } from \"./resultTree.js\";\nimport { calculatePriority } from \"./templatePriority.js\";\nimport { serializeResult } from \"./serializer.js\";\n\nconst XSLT_NS = XSLT_NAMESPACE;\n\n/**\n * XSLT Processing Context\n */\nexport class XsltContext {\n constructor(options = {}) {\n this.currentNode = options.currentNode;\n this.currentNodeList = options.currentNodeList || [];\n this.position = options.position || 1;\n this.variables = { ...options.variables };\n this.parameters = { ...options.parameters };\n this.outputDocument = options.outputDocument;\n this.stylesheet = options.stylesheet;\n this.namespaces = { ...options.namespaces };\n this.templates = options.templates || [];\n this.keys = options.keys || {};\n this.decimalFormats = options.decimalFormats || {};\n this.outputMethod = options.outputMethod || \"xml\";\n this.xpathEvaluator = options.xpathEvaluator || new XPathEvaluator();\n this.currentTemplate = options.currentTemplate || null;\n this.currentMode = options.currentMode ?? null;\n }\n\n clone(overrides = {}) {\n return new XsltContext({\n currentNode: overrides.currentNode ?? this.currentNode,\n currentNodeList: overrides.currentNodeList ?? this.currentNodeList,\n position: overrides.position ?? this.position,\n variables: overrides.variables\n ? { ...this.variables, ...overrides.variables }\n : { ...this.variables },\n parameters: overrides.parameters\n ? { ...this.parameters, ...overrides.parameters }\n : { ...this.parameters },\n outputDocument: this.outputDocument,\n stylesheet: this.stylesheet,\n namespaces: overrides.namespaces\n ? { ...this.namespaces, ...overrides.namespaces }\n : { ...this.namespaces },\n templates: this.templates,\n keys: this.keys,\n decimalFormats: this.decimalFormats,\n outputMethod: this.outputMethod,\n xpathEvaluator: this.xpathEvaluator,\n currentTemplate: overrides.currentTemplate ?? this.currentTemplate,\n currentMode: overrides.currentMode ?? this.currentMode,\n });\n }\n\n getVariable(name) {\n if (name in this.variables) {\n return this.variables[name];\n }\n if (name in this.parameters) {\n return this.parameters[name];\n }\n throw new Error(`Undefined variable: $${name}`);\n }\n\n setVariable(name, value) {\n this.variables[name] = value;\n }\n}\n\n/**\n * XSLT Engine\n */\nexport class XsltEngine {\n constructor(options = {}) {\n this.xpathEvaluator = new XPathEvaluator();\n this.templates = [];\n this.keys = {};\n this.globalVariables = {};\n this.globalParameters = {};\n this.outputSettings = {\n method: \"xml\",\n version: \"1.0\",\n encoding: \"UTF-8\",\n standalone: null,\n indent: \"no\",\n omitXmlDeclaration: \"no\",\n doctypePublic: null,\n doctypeSystem: null,\n mediaType: null,\n cdataSectionElements: [],\n };\n this.namespaces = {};\n this.decimalFormats = {};\n this.stylesheetDoc = null;\n this.attributeSets = {};\n this.namespaceAliases = new NamespaceAliasMap();\n this.stripSpace = [];\n this.preserveSpace = [];\n\n // Import/Include support\n this.stylesheetLoader = options.stylesheetLoader || null;\n this.currentImportPrecedence = 0;\n this.processedStylesheets = new Set();\n this.baseUri = options.baseUri || \"\";\n\n // document() support\n this.documentLoader = options.documentLoader || null;\n this.loadedDocuments = new Map();\n\n // generate-id() support\n this.generatedIds = new WeakMap();\n this.generatedIdCount = 0;\n\n // key() support\n this.rootContext = null;\n this.keyRegistry = new KeyIndexRegistry({\n keys: this.keys,\n matchesPattern: (node, pattern) =>\n this.matchesPattern(node, pattern, this.rootContext),\n evaluateUse: (node, expression) =>\n this.evaluateKeyValues(node, expression),\n });\n\n this.xpathEvaluator.registerFunctions(createXsltFunctions(this));\n }\n\n /**\n * Set the loader used by the XSLT `document()` function.\n *\n * The loader is synchronous and must return a `Document`, an XML string or\n * null. Returning null (or configuring no loader at all) makes `document()`\n * evaluate to an empty node-set instead of failing the transformation.\n *\n * @param {((uri: string, baseUri?: string) => (Document|string|null))|null} loader - The loader, or null to remove it\n * @returns {XsltEngine} This engine, to allow chaining\n *\n * @example\n * engine.setDocumentLoader((uri) => readFileSync(uri, 'utf8'));\n */\n setDocumentLoader(loader) {\n this.documentLoader = loader ?? null;\n this.loadedDocuments.clear();\n return this;\n }\n\n /**\n * Load an external document for the `document()` function.\n *\n * Results are cached per resolved URI for the life of the engine, so the same\n * URI always yields the identical node-set.\n *\n * @param {string} uri - The requested URI, fragment identifiers are ignored\n * @param {string} [baseUri] - Base URI used to resolve relative references\n * @returns {Document|null} The loaded document, or null when unavailable\n *\n * @example\n * engine.loadDocument('data.xml', '/styles/main.xsl');\n */\n loadDocument(uri, baseUri) {\n const target = stripFragment(uri);\n\n if (target === \"\") return this.stylesheetDoc;\n if (!this.documentLoader) return null;\n\n const resolved = resolveUri(target, baseUri);\n if (this.loadedDocuments.has(resolved)) {\n return this.loadedDocuments.get(resolved);\n }\n\n const loaded = this.documentLoader(resolved, baseUri);\n const doc =\n typeof loaded === \"string\" ? this.parseXmlString(loaded) : loaded || null;\n\n this.loadedDocuments.set(resolved, doc);\n return doc;\n }\n\n /**\n * Return the stable identifier of a node for `generate-id()`.\n *\n * @param {Node} node - The node to identify\n * @returns {string} An identifier starting with a letter\n *\n * @example\n * engine.generateId(element); // 'N1'\n */\n generateId(node) {\n let id = this.generatedIds.get(node);\n if (!id) {\n this.generatedIdCount++;\n id = `N${this.generatedIdCount}`;\n this.generatedIds.set(node, id);\n }\n return id;\n }\n\n /**\n * Evaluate the `use` expression of an `xsl:key` for one node.\n *\n * @param {Node} node - The node being indexed\n * @param {string} expression - The `use` expression\n * @returns {string[]} The key values contributed by the node\n */\n evaluateKeyValues(node, expression) {\n const context = this.rootContext.clone({\n currentNode: node,\n currentNodeList: [node],\n position: 1,\n });\n const value = this.evaluateXPath(expression, context);\n\n if (Array.isArray(value)) {\n return value.map((item) => this.xpathEvaluator.getStringValue(item));\n }\n return [this.xpathEvaluator.toString(value)];\n }\n\n /**\n * Set the stylesheet loader function for xsl:import and xsl:include\n * @param {Function} loader - Function(href, baseUri) => Document or string (XML)\n */\n setStylesheetLoader(loader) {\n this.stylesheetLoader = loader;\n }\n\n /**\n * Resolve a relative URI against a base URI\n *\n * @param {string} href - The URI to resolve\n * @param {string} [baseUri] - The base URI\n * @returns {string} The resolved URI\n */\n resolveUri(href, baseUri) {\n return resolveUri(href, baseUri);\n }\n\n /**\n * Load an external stylesheet document\n */\n loadStylesheet(href, baseUri) {\n if (!this.stylesheetLoader) {\n throw new Error(\n `Cannot load stylesheet \"${href}\": no stylesheetLoader configured. ` +\n \"Use engine.setStylesheetLoader(fn) to provide a loader function.\",\n );\n }\n\n const resolvedUri = this.resolveUri(href, baseUri);\n const result = this.stylesheetLoader(resolvedUri, baseUri);\n\n // If result is a string, it needs to be parsed (caller should handle this)\n return { document: result, uri: resolvedUri };\n }\n\n /**\n * Parse XML string to document (helper for stylesheet loading)\n */\n parseXmlString(xmlString) {\n if (typeof DOMParser !== \"undefined\") {\n const parser = new DOMParser();\n const doc = parser.parseFromString(xmlString, \"application/xml\");\n const parseError = doc.querySelector(\"parsererror\");\n if (parseError) {\n throw new Error(`XML parse error: ${parseError.textContent}`);\n }\n return doc;\n }\n throw new Error(\"XML parsing not available in this environment\");\n }\n\n /**\n * Import and compile an XSLT stylesheet\n * @param {Document|Element} stylesheetNode - The stylesheet document or root element\n * @param {string} [stylesheetUri] - Optional URI of the stylesheet for resolving imports\n */\n importStylesheet(stylesheetNode, stylesheetUri) {\n const isMainStylesheet = this.stylesheetDoc === null;\n\n if (isMainStylesheet) {\n this.stylesheetDoc = stylesheetNode.ownerDocument || stylesheetNode;\n if (stylesheetUri) {\n this.baseUri = stylesheetUri;\n this.processedStylesheets.add(stylesheetUri);\n }\n }\n\n const root = stylesheetNode.documentElement || stylesheetNode;\n\n // Validate stylesheet\n if (\n !this.isXsltElement(root, \"stylesheet\") &&\n !this.isXsltElement(root, \"transform\")\n ) {\n // Check for literal result element (simplified stylesheet)\n if (root.getAttribute && root.getAttribute(\"xsl:version\")) {\n this.processLiteralResultStylesheet(root);\n return;\n }\n throw new Error(\n \"Invalid XSLT stylesheet: root element must be xsl:stylesheet or xsl:transform\",\n );\n }\n\n // Collect namespaces from root\n this.collectNamespaces(root);\n\n // XSLT 1.0: xsl:import elements MUST come first and are processed with lower precedence\n // Process imports first (they have lower precedence than the importing stylesheet)\n const imports = [];\n const otherElements = [];\n\n for (const child of root.childNodes) {\n if (child.nodeType !== 1) continue;\n\n if (this.isXsltElement(child, \"import\")) {\n imports.push(child);\n } else {\n otherElements.push(child);\n }\n }\n\n // Process imports (lower precedence - process before current stylesheet)\n for (const importNode of imports) {\n this.processImport(importNode, stylesheetUri || this.baseUri);\n }\n\n // Process other top-level elements (including includes)\n for (const child of otherElements) {\n if (this.isXsltElement(child, \"template\")) {\n this.registerTemplate(child);\n } else if (this.isXsltElement(child, \"output\")) {\n this.processOutput(child);\n } else if (this.isXsltElement(child, \"variable\")) {\n this.processGlobalVariable(child);\n } else if (this.isXsltElement(child, \"param\")) {\n this.processGlobalParam(child);\n } else if (this.isXsltElement(child, \"key\")) {\n this.processKey(child);\n } else if (this.isXsltElement(child, \"decimal-format\")) {\n this.processDecimalFormat(child);\n } else if (this.isXsltElement(child, \"namespace-alias\")) {\n this.processNamespaceAlias(child);\n } else if (this.isXsltElement(child, \"attribute-set\")) {\n this.processAttributeSet(child);\n } else if (this.isXsltElement(child, \"strip-space\")) {\n this.processStripSpace(child);\n } else if (this.isXsltElement(child, \"preserve-space\")) {\n this.processPreserveSpace(child);\n } else if (this.isXsltElement(child, \"include\")) {\n this.processInclude(child, stylesheetUri || this.baseUri);\n }\n }\n\n // Increment import precedence after processing this stylesheet\n if (isMainStylesheet) {\n this.currentImportPrecedence++;\n }\n }\n\n /**\n * Process xsl:include element\n * Includes are merged at the same import precedence level\n */\n processInclude(node, baseUri) {\n const href = node.getAttribute(\"href\");\n if (!href) {\n throw new Error(\"xsl:include requires an href attribute\");\n }\n\n const resolvedUri = this.resolveUri(href, baseUri);\n\n // Check for circular includes\n if (this.processedStylesheets.has(resolvedUri)) {\n throw new Error(`Circular stylesheet reference detected: ${resolvedUri}`);\n }\n\n this.processedStylesheets.add(resolvedUri);\n\n try {\n const { document: stylesheetDoc } = this.loadStylesheet(href, baseUri);\n\n // Parse if string\n let doc = stylesheetDoc;\n if (typeof stylesheetDoc === \"string\") {\n doc = this.parseXmlString(stylesheetDoc);\n }\n\n // Process the included stylesheet at the same import precedence\n const savedPrecedence = this.currentImportPrecedence;\n this.processIncludedStylesheet(doc, resolvedUri);\n this.currentImportPrecedence = savedPrecedence;\n } catch (error) {\n throw new Error(\n `Failed to include stylesheet \"${href}\": ${error.message}`,\n { cause: error },\n );\n }\n }\n\n /**\n * Process xsl:import element\n * Imports have lower precedence than the importing stylesheet\n */\n processImport(node, baseUri) {\n const href = node.getAttribute(\"href\");\n if (!href) {\n throw new Error(\"xsl:import requires an href attribute\");\n }\n\n const resolvedUri = this.resolveUri(href, baseUri);\n\n // Check for circular imports\n if (this.processedStylesheets.has(resolvedUri)) {\n throw new Error(`Circular stylesheet reference detected: ${resolvedUri}`);\n }\n\n this.processedStylesheets.add(resolvedUri);\n\n try {\n const { document: stylesheetDoc } = this.loadStylesheet(href, baseUri);\n\n // Parse if string\n let doc = stylesheetDoc;\n if (typeof stylesheetDoc === \"string\") {\n doc = this.parseXmlString(stylesheetDoc);\n }\n\n // Process the imported stylesheet (imports have lower precedence)\n // Don't increment precedence yet - imported templates get current (lower) precedence\n this.processIncludedStylesheet(doc, resolvedUri);\n\n // After processing import, increment precedence for next imports and main stylesheet\n this.currentImportPrecedence++;\n } catch (error) {\n throw new Error(\n `Failed to import stylesheet \"${href}\": ${error.message}`,\n { cause: error },\n );\n }\n }\n\n /**\n * Process an included/imported stylesheet document\n */\n processIncludedStylesheet(stylesheetDoc, stylesheetUri) {\n const root = stylesheetDoc.documentElement || stylesheetDoc;\n\n // Validate stylesheet\n if (\n !this.isXsltElement(root, \"stylesheet\") &&\n !this.isXsltElement(root, \"transform\")\n ) {\n throw new Error(\n \"Included/imported document is not a valid XSLT stylesheet\",\n );\n }\n\n // Collect namespaces\n this.collectNamespaces(root);\n\n // Process imports first (they have lower precedence)\n const imports = [];\n const otherElements = [];\n\n for (const child of root.childNodes) {\n if (child.nodeType !== 1) continue;\n\n if (this.isXsltElement(child, \"import\")) {\n imports.push(child);\n } else {\n otherElements.push(child);\n }\n }\n\n // Process nested imports\n for (const importNode of imports) {\n this.processImport(importNode, stylesheetUri);\n }\n\n // Process other elements\n for (const child of otherElements) {\n if (this.isXsltElement(child, \"template\")) {\n this.registerTemplate(child);\n } else if (this.isXsltElement(child, \"output\")) {\n this.processOutput(child);\n } else if (this.isXsltElement(child, \"variable\")) {\n this.processGlobalVariable(child);\n } else if (this.isXsltElement(child, \"param\")) {\n this.processGlobalParam(child);\n } else if (this.isXsltElement(child, \"key\")) {\n this.processKey(child);\n } else if (this.isXsltElement(child, \"decimal-format\")) {\n this.processDecimalFormat(child);\n } else if (this.isXsltElement(child, \"namespace-alias\")) {\n this.processNamespaceAlias(child);\n } else if (this.isXsltElement(child, \"attribute-set\")) {\n this.processAttributeSet(child);\n } else if (this.isXsltElement(child, \"strip-space\")) {\n this.processStripSpace(child);\n } else if (this.isXsltElement(child, \"preserve-space\")) {\n this.processPreserveSpace(child);\n } else if (this.isXsltElement(child, \"include\")) {\n this.processInclude(child, stylesheetUri);\n }\n }\n }\n\n processLiteralResultStylesheet(root) {\n // Simplified stylesheet - entire document is one template matching /\n this.templates.push({\n match: \"/\",\n name: null,\n mode: null,\n priority: 0.5,\n node: root,\n });\n }\n\n collectNamespaces(node) {\n if (!node.attributes) return;\n\n for (const attr of node.attributes) {\n if (attr.name.startsWith(\"xmlns:\")) {\n const prefix = attr.name.substring(6);\n if (attr.value !== XSLT_NS) {\n this.namespaces[prefix] = attr.value;\n }\n } else if (attr.name === \"xmlns\" && attr.value !== XSLT_NS) {\n this.namespaces[\"\"] = attr.value;\n }\n }\n }\n\n /**\n * Register a template rule.\n *\n * A union match pattern is equivalent to a set of template rules, one per\n * alternative (XSLT 1.0 section 5.5), so each alternative is registered\n * separately with its own default priority.\n *\n * @param {Element} node - The xsl:template element\n */\n registerTemplate(node) {\n const match = node.getAttribute(\"match\");\n const name = node.getAttribute(\"name\");\n const mode = node.getAttribute(\"mode\") || null;\n const priorityAttr = node.getAttribute(\"priority\");\n const alternatives = match\n ? this.splitUnionPattern(match).map((p) => p.trim())\n : [null];\n\n for (const alternative of alternatives) {\n this.templates.push({\n match: alternative,\n name,\n mode,\n priority: priorityAttr\n ? parseFloat(priorityAttr)\n : this.calculatePriority(alternative),\n importPrecedence: this.currentImportPrecedence,\n node,\n });\n }\n }\n\n /**\n * Default priority of a single match pattern (see templatePriority.js).\n *\n * @param {string|null} matchPattern - The match pattern\n * @returns {number} The default priority\n */\n calculatePriority(matchPattern) {\n return calculatePriority(matchPattern ? matchPattern.trim() : matchPattern);\n }\n\n processOutput(node) {\n const method = node.getAttribute(\"method\");\n if (method) this.outputSettings.method = method;\n\n const version = node.getAttribute(\"version\");\n if (version) this.outputSettings.version = version;\n\n const encoding = node.getAttribute(\"encoding\");\n if (encoding) this.outputSettings.encoding = encoding;\n\n const standalone = node.getAttribute(\"standalone\");\n if (standalone) this.outputSettings.standalone = standalone;\n\n const indent = node.getAttribute(\"indent\");\n if (indent) this.outputSettings.indent = indent;\n\n const omit = node.getAttribute(\"omit-xml-declaration\");\n if (omit) this.outputSettings.omitXmlDeclaration = omit;\n\n const doctypePublic = node.getAttribute(\"doctype-public\");\n if (doctypePublic) this.outputSettings.doctypePublic = doctypePublic;\n\n const doctypeSystem = node.getAttribute(\"doctype-system\");\n if (doctypeSystem) this.outputSettings.doctypeSystem = doctypeSystem;\n\n const mediaType = node.getAttribute(\"media-type\");\n if (mediaType) this.outputSettings.mediaType = mediaType;\n\n const cdataElements = node.getAttribute(\"cdata-section-elements\");\n if (cdataElements) {\n this.outputSettings.cdataSectionElements = cdataElements\n .split(/\\s+/)\n .filter(Boolean);\n }\n }\n\n processGlobalVariable(node) {\n const name = node.getAttribute(\"name\");\n const select = node.getAttribute(\"select\");\n\n this.globalVariables[name] = { node, select };\n }\n\n /**\n * Register an `xsl:param` top level declaration.\n *\n * A value supplied from outside (through `setParameter`) has precedence over\n * the declared default, so it survives compilation of the stylesheet.\n *\n * @param {Element} node - The `xsl:param` element\n * @returns {void}\n */\n processGlobalParam(node) {\n const name = node.getAttribute(\"name\");\n const select = node.getAttribute(\"select\");\n const existing = this.globalParameters[name];\n const definition = { node, select };\n\n if (existing && \"value\" in existing) {\n definition.value = existing.value;\n }\n\n this.globalParameters[name] = definition;\n }\n\n /**\n * Supply the value of a global parameter from outside the stylesheet.\n *\n * The value is merged into the `xsl:param` declaration when there is one, so\n * removing the value later restores the declared default.\n *\n * @param {string} name - The parameter name, `{uri}local` when namespaced\n * @param {*} value - The value to use\n * @returns {void}\n *\n * @example\n * engine.setParameterValue('sortOrder', 'ascending');\n */\n setParameterValue(name, value) {\n const definition = this.globalParameters[name];\n\n if (definition) definition.value = value;\n else this.globalParameters[name] = { value };\n }\n\n /**\n * Remove an externally supplied parameter value.\n *\n * The `xsl:param` declaration of the stylesheet is kept, so the parameter\n * falls back to its declared default instead of becoming undefined.\n *\n * @param {string} name - The parameter name, `{uri}local` when namespaced\n * @returns {void}\n *\n * @example\n * engine.clearParameterValue('sortOrder');\n */\n clearParameterValue(name) {\n const definition = this.globalParameters[name];\n if (!definition) return;\n\n if (definition.node) delete definition.value;\n else delete this.globalParameters[name];\n }\n\n /**\n * Remove every externally supplied parameter value.\n *\n * @returns {void}\n *\n * @example\n * engine.clearParameterValues();\n */\n clearParameterValues() {\n for (const name of Object.keys(this.globalParameters)) {\n this.clearParameterValue(name);\n }\n }\n\n processKey(node) {\n const name = node.getAttribute(\"name\");\n const match = node.getAttribute(\"match\");\n const use = node.getAttribute(\"use\");\n\n this.keys[name] = { match, use };\n this.keyRegistry.clear();\n }\n\n processDecimalFormat(node) {\n const name = node.getAttribute(\"name\") || \"\";\n\n this.decimalFormats[name] = {\n decimalSeparator: node.getAttribute(\"decimal-separator\") || \".\",\n groupingSeparator: node.getAttribute(\"grouping-separator\") || \",\",\n percent: node.getAttribute(\"percent\") || \"%\",\n perMille: node.getAttribute(\"per-mille\") || \"\\u2030\",\n zeroDigit: node.getAttribute(\"zero-digit\") || \"0\",\n digit: node.getAttribute(\"digit\") || \"#\",\n patternSeparator: node.getAttribute(\"pattern-separator\") || \";\",\n infinity: node.getAttribute(\"infinity\") || \"Infinity\",\n nan: node.getAttribute(\"NaN\") || \"NaN\",\n minusSign: node.getAttribute(\"minus-sign\") || \"-\",\n };\n }\n\n processNamespaceAlias(node) {\n this.namespaceAliases.add(node);\n }\n\n processAttributeSet(node) {\n const name = node.getAttribute(\"name\");\n const useAttributeSets = node.getAttribute(\"use-attribute-sets\");\n\n this.attributeSets[name] = {\n node,\n useAttributeSets: useAttributeSets\n ? useAttributeSets.split(/\\s+/).filter(Boolean)\n : [],\n };\n }\n\n processStripSpace(node) {\n const elements = node.getAttribute(\"elements\");\n if (elements) {\n this.stripSpace.push(...elements.split(/\\s+/).filter(Boolean));\n }\n }\n\n processPreserveSpace(node) {\n const elements = node.getAttribute(\"elements\");\n if (elements) {\n this.preserveSpace.push(...elements.split(/\\s+/).filter(Boolean));\n }\n }\n\n /**\n * Transform a source document\n */\n transform(sourceNode, ownerDocument) {\n const doc =\n ownerDocument || (typeof document !== \"undefined\" ? document : null);\n\n if (!doc) {\n throw new Error(\"No output document available\");\n }\n\n // Build the result tree in a neutral XML document: creating nodes directly\n // in an HTML owner document would lower case names and force the XHTML\n // namespace on every element.\n const resultDocument = createResultDocument(doc);\n const source = this.prepareSource(sourceNode, doc);\n\n // Create context - use document node as initial context for \"/\" template matching\n // XPath paths like \"RootElement/child\" expect to start from document node\n const context = new XsltContext({\n currentNode: source,\n currentNodeList: [source],\n position: 1,\n outputDocument: resultDocument,\n stylesheet: this.stylesheetDoc,\n namespaces: { ...this.namespaces },\n templates: this.templates,\n keys: this.keys,\n decimalFormats: this.decimalFormats,\n outputMethod: this.outputSettings.method,\n xpathEvaluator: this.xpathEvaluator,\n });\n\n this.rootContext = context;\n\n // Evaluate global variables\n for (const [name, def] of Object.entries(this.globalParameters)) {\n if (!(name in context.parameters)) {\n context.parameters[name] = this.evaluateVariable(def, context);\n }\n }\n\n for (const [name, def] of Object.entries(this.globalVariables)) {\n context.variables[name] = this.evaluateVariable(def, context);\n }\n\n // Create result document fragment\n const fragment = resultDocument.createDocumentFragment();\n\n // Apply templates to document node (not documentElement)\n // This ensures \"/\" template has document as context, so paths like\n // \"RootElement/child\" work correctly\n this.applyTemplates([source], null, context, fragment);\n\n return importResultFragment(fragment, doc);\n }\n\n /**\n * Apply `xsl:strip-space` to the source tree.\n *\n * Stripping produces a copy so the caller's document is never modified; when\n * no `xsl:strip-space` is declared the original node is used unchanged.\n *\n * @param {Node} sourceNode - The source document or element\n * @param {Document} ownerDocument - Document providing the DOM implementation\n * @returns {Node} The source to transform\n */\n prepareSource(sourceNode, ownerDocument) {\n const filter = new WhitespaceFilter(this.stripSpace, this.preserveSpace);\n if (!filter.isActive()) return sourceNode;\n\n return stripWhitespaceNodes(\n sourceNode,\n filter,\n createResultDocument(ownerDocument),\n );\n }\n\n /**\n * Transform to a complete document\n */\n transformToDocument(sourceNode) {\n // For Node.js environments, we need a document implementation\n const doc = this.createDocument(sourceNode);\n const fragment = this.transform(sourceNode, doc);\n\n // Move fragment contents to document\n while (fragment.firstChild) {\n doc.appendChild(fragment.firstChild);\n }\n\n return doc;\n }\n\n /**\n * Transform a source document and serialize the result to a string.\n *\n * Non-W3C convenience method: the result tree is serialized honoring the\n * `xsl:output` settings of the stylesheet (XSLT 1.0 section 16).\n *\n * @param {Node} sourceNode - Source document or element to transform\n * @returns {string} The serialized transformation result\n */\n transformToString(sourceNode) {\n const fragment = this.transform(\n sourceNode,\n this.createDocument(sourceNode),\n );\n return serializeResult(fragment, this.outputSettings);\n }\n\n /**\n * Create an empty XML document to hold a transformation result.\n *\n * Uses the global `document` when running in a browser and otherwise falls\n * back to the DOM implementation owning `referenceNode` (e.g. a jsdom or\n * xmldom document in Node.js).\n *\n * @param {Node} [referenceNode] - Any node whose DOM implementation can be reused\n * @returns {Document} A new empty document\n * @throws {Error} When no DOM implementation is available\n */\n createDocument(referenceNode) {\n if (typeof document !== \"undefined\") {\n return document.implementation.createDocument(null, null, null);\n }\n\n const ownerDocument =\n referenceNode &&\n (referenceNode.nodeType === 9\n ? referenceNode\n : referenceNode.ownerDocument);\n if (ownerDocument?.implementation) {\n return ownerDocument.implementation.createDocument(null, null, null);\n }\n\n throw new Error(\"Document creation not available in this environment\");\n }\n\n /**\n * Compute the value of a variable or parameter definition.\n *\n * A value supplied from outside (`setParameter`) wins over the `select`\n * expression and over the instantiated content of the declaration.\n *\n * @param {{value?: *, select?: string, node?: Element}} def - The definition\n * @param {XsltContext} context - The context used for evaluation\n * @returns {*} The variable value\n */\n evaluateVariable(def, context) {\n if (\"value\" in def) {\n return def.value;\n }\n\n if (def.select) {\n return this.evaluateXPath(def.select, context);\n }\n\n // If no select, evaluate content as result tree fragment\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(def.node, context, fragment);\n return fragment;\n }\n\n /**\n * Apply templates to a node list\n */\n applyTemplates(nodes, mode, context, output) {\n const nodeList = Array.isArray(nodes) ? nodes : [nodes];\n\n for (let i = 0; i < nodeList.length; i++) {\n const node = nodeList[i];\n const template = this.findMatchingTemplate(node, mode, context);\n\n if (template) {\n const newContext = context.clone({\n currentNode: node,\n currentNodeList: nodeList,\n position: i + 1,\n currentTemplate: template,\n currentMode: mode,\n });\n\n this.processTemplate(template.node, newContext, output);\n } else {\n // Built-in templates\n this.applyBuiltinTemplate(node, mode, context, output);\n }\n }\n }\n\n /**\n * Find the best matching template for a node\n */\n findMatchingTemplate(node, mode, context, maxImportPrecedence = Infinity) {\n let bestMatch = null;\n let bestPriority = -Infinity;\n let bestImportPrecedence = -Infinity;\n\n for (const template of this.templates) {\n if (template.mode !== mode) continue;\n if (!template.match) continue;\n if ((template.importPrecedence || 0) >= maxImportPrecedence) continue;\n\n if (this.matchesPattern(node, template.match, context)) {\n const priority = template.priority;\n const importPrecedence = template.importPrecedence || 0;\n\n if (\n importPrecedence > bestImportPrecedence ||\n (importPrecedence === bestImportPrecedence && priority > bestPriority)\n ) {\n bestMatch = template;\n bestPriority = priority;\n bestImportPrecedence = importPrecedence;\n }\n }\n }\n\n return bestMatch;\n }\n\n /**\n * Check if a node matches an XSLT pattern\n */\n matchesPattern(node, pattern, context) {\n // Split union patterns\n const patterns = this.splitUnionPattern(pattern);\n\n for (const p of patterns) {\n if (this.matchesSinglePattern(node, p.trim(), context)) {\n return true;\n }\n }\n\n return false;\n }\n\n splitUnionPattern(pattern) {\n // Simple split on | not inside predicates or strings\n const parts = [];\n let current = \"\";\n let depth = 0;\n let inString = false;\n let stringChar = \"\";\n\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i];\n\n if (inString) {\n current += char;\n if (char === stringChar) {\n inString = false;\n }\n } else if (char === '\"' || char === \"'\") {\n inString = true;\n stringChar = char;\n current += char;\n } else if (char === \"[\") {\n depth++;\n current += char;\n } else if (char === \"]\") {\n depth--;\n current += char;\n } else if (char === \"|\" && depth === 0) {\n parts.push(current);\n current = \"\";\n } else {\n current += char;\n }\n }\n\n if (current) {\n parts.push(current);\n }\n\n return parts;\n }\n\n matchesSinglePattern(node, pattern, context) {\n try {\n // Handle root pattern\n if (pattern === \"/\") {\n return (\n node.nodeType === 9 || node === node.ownerDocument?.documentElement\n );\n }\n\n // Handle patterns like \"item\" (child match)\n // Need to check if node would be selected by pattern from parent\n const ast = parseXPath(pattern);\n\n // For patterns starting with /, evaluate from root\n if (pattern.startsWith(\"/\")) {\n const doc = node.ownerDocument || node;\n const xpathContext = new XPathContext(\n doc,\n 1,\n 1,\n { ...context.variables, ...context.parameters },\n context.namespaces,\n context,\n );\n const result = this.xpathEvaluator.evaluate(ast, xpathContext);\n const nodes = Array.isArray(result) ? result : [result];\n return nodes.includes(node);\n }\n\n // For relative patterns, check if this node matches when evaluated from\n // its parent; attribute nodes are reached through their owner element\n const parent = node.nodeType === 2 ? node.ownerElement : node.parentNode;\n if (parent) {\n const xpathContext = new XPathContext(\n parent,\n 1,\n 1,\n { ...context.variables, ...context.parameters },\n context.namespaces,\n context,\n );\n const result = this.xpathEvaluator.evaluate(ast, xpathContext);\n const nodes = Array.isArray(result) ? result : [result];\n return nodes.includes(node);\n }\n\n // For document node without parent\n const xpathContext = new XPathContext(\n node,\n 1,\n 1,\n { ...context.variables, ...context.parameters },\n context.namespaces,\n context,\n );\n const result = this.xpathEvaluator.evaluate(ast, xpathContext);\n const nodes = Array.isArray(result) ? result : [result];\n return nodes.includes(node);\n } catch {\n return false;\n }\n }\n\n /**\n * Apply built-in template rules\n */\n applyBuiltinTemplate(node, mode, context, output) {\n switch (node.nodeType) {\n case 1: // Element\n case 9: // Document\n case 11: // Document Fragment\n // Process children\n this.applyTemplates(Array.from(node.childNodes), mode, context, output);\n break;\n\n case 3: // Text\n case 4: {\n // CDATA\n // Copy text value\n const text = context.outputDocument.createTextNode(\n node.nodeValue || \"\",\n );\n output.appendChild(text);\n break;\n }\n\n case 2: {\n // Attribute\n // Copy attribute value as text\n const attrText = context.outputDocument.createTextNode(\n node.nodeValue || \"\",\n );\n output.appendChild(attrText);\n break;\n }\n\n // Comments and PIs have no built-in template\n }\n }\n\n /**\n * Process template content\n */\n processTemplate(templateNode, context, output) {\n // Process template parameters first\n const localContext = context.clone();\n\n for (const child of templateNode.childNodes) {\n if (child.nodeType === 1 && this.isXsltElement(child, \"param\")) {\n const name = child.getAttribute(\"name\");\n if (!(name in localContext.parameters)) {\n localContext.parameters[name] = this.evaluateVariable(\n { node: child, select: child.getAttribute(\"select\") },\n localContext,\n );\n }\n }\n }\n\n this.processChildren(templateNode, localContext, output);\n }\n\n /**\n * Process child nodes of an XSLT element\n */\n processChildren(node, context, output) {\n for (const child of node.childNodes) {\n this.processNode(child, context, output);\n }\n }\n\n /**\n * Process a single node in the stylesheet\n */\n processNode(node, context, output) {\n switch (node.nodeType) {\n case 1: // Element\n this.processElement(node, context, output);\n break;\n\n case 3: // Text\n case 4: {\n // CDATA\n // Output text if not whitespace only (or if preserving space)\n const text = node.nodeValue;\n if (text && (text.trim() || this.shouldPreserveSpace(node))) {\n const textNode = context.outputDocument.createTextNode(text);\n output.appendChild(textNode);\n }\n break;\n }\n }\n }\n\n shouldPreserveSpace(node) {\n // Check xml:space attribute on ancestors\n let current = node.parentNode;\n while (current && current.nodeType === 1) {\n const space = current.getAttribute(\"xml:space\");\n if (space === \"preserve\") return true;\n if (space === \"default\") return false;\n current = current.parentNode;\n }\n return false;\n }\n\n /**\n * Process an element in the stylesheet\n */\n processElement(node, context, output) {\n // Check if XSLT element\n if (this.isXsltNamespace(node)) {\n this.processXsltElement(node, context, output);\n } else {\n // Literal result element\n this.processLiteralResultElement(node, context, output);\n }\n }\n\n /**\n * Process an XSLT instruction element\n */\n processXsltElement(node, context, output) {\n const localName = node.localName || node.nodeName.replace(/^xsl:/, \"\");\n\n switch (localName) {\n case \"apply-templates\":\n this.xslApplyTemplates(node, context, output);\n break;\n\n case \"apply-imports\":\n this.xslApplyImports(node, context, output);\n break;\n\n case \"call-template\":\n this.xslCallTemplate(node, context, output);\n break;\n\n case \"value-of\":\n this.xslValueOf(node, context, output);\n break;\n\n case \"text\":\n this.xslText(node, context, output);\n break;\n\n case \"element\":\n this.xslElement(node, context, output);\n break;\n\n case \"attribute\":\n this.xslAttribute(node, context, output);\n break;\n\n case \"if\":\n this.xslIf(node, context, output);\n break;\n\n case \"choose\":\n this.xslChoose(node, context, output);\n break;\n\n case \"for-each\":\n this.xslForEach(node, context, output);\n break;\n\n case \"copy\":\n this.xslCopy(node, context, output);\n break;\n\n case \"copy-of\":\n this.xslCopyOf(node, context, output);\n break;\n\n case \"variable\":\n this.xslVariable(node, context, output);\n break;\n\n case \"param\":\n // Params are processed at template start\n break;\n\n case \"comment\":\n this.xslComment(node, context, output);\n break;\n\n case \"processing-instruction\":\n this.xslProcessingInstruction(node, context, output);\n break;\n\n case \"number\":\n this.xslNumber(node, context, output);\n break;\n\n case \"sort\":\n // Handled by apply-templates and for-each\n break;\n\n case \"with-param\":\n // Handled by call-template and apply-templates\n break;\n\n case \"message\":\n this.xslMessage(node, context, output);\n break;\n\n case \"fallback\":\n // Used for forward compatibility\n break;\n\n default:\n console.warn(`Unknown XSLT element: ${localName}`);\n }\n }\n\n /**\n * Process a literal result element (non-XSLT)\n *\n * Applies `xsl:namespace-alias` to the element and its attributes, honours\n * `xsl:use-attribute-sets` and keeps XSLT-only attributes and namespace\n * declarations out of the result tree.\n *\n * @param {Element} node - The literal result element in the stylesheet\n * @param {XsltContext} context - The current XSLT context\n * @param {Node} output - The result tree node receiving the element\n * @returns {void}\n */\n processLiteralResultElement(node, context, output) {\n const localName = node.localName || node.nodeName;\n const alias = this.namespaceAliases.resolve(node.namespaceURI, localName);\n const namespaceUri = alias ? alias.namespaceUri : node.namespaceURI;\n const qname = alias ? alias.qname : node.nodeName;\n\n const outputElement =\n namespaceUri && context.outputDocument.createElementNS\n ? context.outputDocument.createElementNS(namespaceUri, qname)\n : context.outputDocument.createElement(qname);\n\n // Attribute sets come first so literal attributes take precedence\n const useAttributeSets = getXsltAttribute(\n node,\n \"use-attribute-sets\",\n XSLT_NS,\n );\n if (useAttributeSets) {\n this.applyAttributeSets(useAttributeSets, context, outputElement);\n }\n\n if (node.attributes) {\n for (const attr of node.attributes) {\n if (!shouldCopyAttribute(attr, XSLT_NS)) continue;\n\n const value = this.processAttributeValueTemplate(attr.value, context);\n const attrAlias = this.namespaceAliases.resolve(\n attr.namespaceURI,\n attr.localName || attr.name,\n );\n\n if (attrAlias) {\n outputElement.setAttributeNS(\n attrAlias.namespaceUri,\n attrAlias.qname,\n value,\n );\n } else {\n outputElement.setAttribute(attr.name, value);\n }\n }\n }\n\n // Process children\n this.processChildren(node, context, outputElement);\n\n output.appendChild(outputElement);\n }\n\n /**\n * Process attribute value templates (expressions in curly braces)\n */\n processAttributeValueTemplate(value, context) {\n if (!value.includes(\"{\")) return value;\n\n let result = \"\";\n let i = 0;\n\n while (i < value.length) {\n if (value[i] === \"{\") {\n if (value[i + 1] === \"{\") {\n // Escaped brace\n result += \"{\";\n i += 2;\n } else {\n // Find closing brace\n let depth = 1;\n let j = i + 1;\n while (j < value.length && depth > 0) {\n if (value[j] === \"{\") depth++;\n else if (value[j] === \"}\") depth--;\n j++;\n }\n\n const expr = value.substring(i + 1, j - 1);\n const evalResult = this.evaluateXPath(expr, context);\n result += this.xpathEvaluator.toString(evalResult);\n i = j;\n }\n } else if (value[i] === \"}\") {\n if (value[i + 1] === \"}\") {\n // Escaped brace\n result += \"}\";\n i += 2;\n } else {\n throw new Error(\"Unmatched } in attribute value template\");\n }\n } else {\n result += value[i];\n i++;\n }\n }\n\n return result;\n }\n\n // XSLT Instructions\n xslApplyTemplates(node, context, output) {\n const select = node.getAttribute(\"select\") || \"node()\";\n const mode = node.getAttribute(\"mode\") || null;\n\n // Evaluate select expression\n let nodes = this.evaluateXPath(select, context);\n if (!Array.isArray(nodes)) {\n nodes = nodes ? [nodes] : [];\n }\n\n // Collect sort specifications\n const sortSpecs = [];\n for (const child of node.childNodes) {\n if (child.nodeType === 1 && this.isXsltElement(child, \"sort\")) {\n sortSpecs.push({\n select: child.getAttribute(\"select\") || \".\",\n order: child.getAttribute(\"order\") || \"ascending\",\n dataType: child.getAttribute(\"data-type\") || \"text\",\n caseOrder: child.getAttribute(\"case-order\") || \"upper-first\",\n lang: child.getAttribute(\"lang\"),\n });\n }\n }\n\n // Apply sorting\n if (sortSpecs.length > 0) {\n nodes = this.sortNodes(nodes, sortSpecs, context);\n }\n\n // Collect with-param values\n const params = {};\n for (const child of node.childNodes) {\n if (child.nodeType === 1 && this.isXsltElement(child, \"with-param\")) {\n const name = child.getAttribute(\"name\");\n const selectAttr = child.getAttribute(\"select\");\n if (selectAttr) {\n params[name] = this.evaluateXPath(selectAttr, context);\n } else {\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(child, context, fragment);\n params[name] = fragment;\n }\n }\n }\n\n // Apply templates with new context including params\n const newContext = context.clone({\n parameters: { ...context.parameters, ...params },\n });\n this.applyTemplates(nodes, mode, newContext, output);\n }\n\n /**\n * Instantiate `xsl:apply-imports`.\n *\n * Only templates with a lower import precedence than the template being\n * instantiated are considered; when none matches, the built-in template rules\n * apply, exactly as for `xsl:apply-templates`.\n *\n * @param {Element} node - The `xsl:apply-imports` element\n * @param {XsltContext} context - The current XSLT context\n * @param {Node} output - The result tree node receiving the output\n * @returns {void}\n */\n xslApplyImports(node, context, output) {\n const currentNode = context.currentNode;\n const mode = context.currentMode ?? null;\n const precedence = context.currentTemplate\n ? context.currentTemplate.importPrecedence || 0\n : 0;\n\n const template = this.findMatchingTemplate(\n currentNode,\n mode,\n context,\n precedence,\n );\n\n if (!template) {\n this.applyBuiltinTemplate(currentNode, mode, context, output);\n return;\n }\n\n this.processTemplate(\n template.node,\n context.clone({ currentTemplate: template }),\n output,\n );\n }\n\n xslCallTemplate(node, context, output) {\n const name = node.getAttribute(\"name\");\n\n // Find named template\n const template = this.templates.find((t) => t.name === name);\n if (!template) {\n throw new Error(`Template not found: ${name}`);\n }\n\n // Collect with-param values\n const params = {};\n for (const child of node.childNodes) {\n if (child.nodeType === 1 && this.isXsltElement(child, \"with-param\")) {\n const paramName = child.getAttribute(\"name\");\n const selectAttr = child.getAttribute(\"select\");\n if (selectAttr) {\n params[paramName] = this.evaluateXPath(selectAttr, context);\n } else {\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(child, context, fragment);\n params[paramName] = fragment;\n }\n }\n }\n\n // Call template with params\n const newContext = context.clone({\n parameters: { ...context.parameters, ...params },\n });\n this.processTemplate(template.node, newContext, output);\n }\n\n xslValueOf(node, context, output) {\n const select = node.getAttribute(\"select\");\n const disableOutputEscaping =\n node.getAttribute(\"disable-output-escaping\") === \"yes\";\n\n const result = this.evaluateXPath(select, context);\n const text = this.xpathEvaluator.toString(result);\n\n if (text) {\n const textNode = context.outputDocument.createTextNode(text);\n if (disableOutputEscaping) {\n textNode._disableOutputEscaping = true;\n }\n output.appendChild(textNode);\n }\n }\n\n xslText(node, context, output) {\n const disableOutputEscaping =\n node.getAttribute(\"disable-output-escaping\") === \"yes\";\n let text = \"\";\n\n for (const child of node.childNodes) {\n if (child.nodeType === 3 || child.nodeType === 4) {\n text += child.nodeValue || \"\";\n }\n }\n\n if (text) {\n const textNode = context.outputDocument.createTextNode(text);\n if (disableOutputEscaping) {\n textNode._disableOutputEscaping = true;\n }\n output.appendChild(textNode);\n }\n }\n\n xslElement(node, context, output) {\n const name = this.processAttributeValueTemplate(\n node.getAttribute(\"name\"),\n context,\n );\n const namespace = node.getAttribute(\"namespace\");\n const useAttributeSets = node.getAttribute(\"use-attribute-sets\");\n\n let element;\n if (namespace) {\n const ns = this.processAttributeValueTemplate(namespace, context);\n element = context.outputDocument.createElementNS(ns, name);\n } else {\n element = context.outputDocument.createElement(name);\n }\n\n // Apply attribute sets\n if (useAttributeSets) {\n this.applyAttributeSets(useAttributeSets, context, element);\n }\n\n this.processChildren(node, context, element);\n output.appendChild(element);\n }\n\n xslAttribute(node, context, output) {\n const name = this.processAttributeValueTemplate(\n node.getAttribute(\"name\"),\n context,\n );\n const namespace = node.getAttribute(\"namespace\");\n\n // Collect content\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(node, context, fragment);\n\n // Get text content\n let value = \"\";\n const getText = (n) => {\n if (n.nodeType === 3 || n.nodeType === 4) {\n value += n.nodeValue || \"\";\n } else if (n.childNodes) {\n for (const child of n.childNodes) {\n getText(child);\n }\n }\n };\n getText(fragment);\n\n // Add attribute to parent element\n if (output.nodeType === 1) {\n if (namespace) {\n const ns = this.processAttributeValueTemplate(namespace, context);\n output.setAttributeNS(ns, name, value);\n } else {\n output.setAttribute(name, value);\n }\n }\n }\n\n xslIf(node, context, output) {\n const test = node.getAttribute(\"test\");\n const result = this.evaluateXPath(test, context);\n\n if (this.xpathEvaluator.toBoolean(result)) {\n this.processChildren(node, context, output);\n }\n }\n\n xslChoose(node, context, output) {\n for (const child of node.childNodes) {\n if (child.nodeType !== 1) continue;\n\n if (this.isXsltElement(child, \"when\")) {\n const test = child.getAttribute(\"test\");\n const result = this.evaluateXPath(test, context);\n\n if (this.xpathEvaluator.toBoolean(result)) {\n this.processChildren(child, context, output);\n return;\n }\n } else if (this.isXsltElement(child, \"otherwise\")) {\n this.processChildren(child, context, output);\n return;\n }\n }\n }\n\n xslForEach(node, context, output) {\n const select = node.getAttribute(\"select\");\n\n let nodes = this.evaluateXPath(select, context);\n if (!Array.isArray(nodes)) {\n nodes = nodes ? [nodes] : [];\n }\n\n // Collect sort specifications\n const sortSpecs = [];\n for (const child of node.childNodes) {\n if (child.nodeType === 1 && this.isXsltElement(child, \"sort\")) {\n sortSpecs.push({\n select: child.getAttribute(\"select\") || \".\",\n order: child.getAttribute(\"order\") || \"ascending\",\n dataType: child.getAttribute(\"data-type\") || \"text\",\n caseOrder: child.getAttribute(\"case-order\") || \"upper-first\",\n lang: child.getAttribute(\"lang\"),\n });\n }\n }\n\n // Apply sorting\n if (sortSpecs.length > 0) {\n nodes = this.sortNodes(nodes, sortSpecs, context);\n }\n\n // Process each node\n for (let i = 0; i < nodes.length; i++) {\n const newContext = context.clone({\n currentNode: nodes[i],\n currentNodeList: nodes,\n position: i + 1,\n });\n\n this.processChildren(node, newContext, output);\n }\n }\n\n xslCopy(node, context, output) {\n const currentNode = context.currentNode;\n const useAttributeSets = node.getAttribute(\"use-attribute-sets\");\n\n switch (currentNode.nodeType) {\n case 1: {\n // Element\n let copy;\n if (currentNode.namespaceURI) {\n copy = context.outputDocument.createElementNS(\n currentNode.namespaceURI,\n currentNode.nodeName,\n );\n } else {\n copy = context.outputDocument.createElement(currentNode.nodeName);\n }\n\n if (useAttributeSets) {\n this.applyAttributeSets(useAttributeSets, context, copy);\n }\n\n this.processChildren(node, context, copy);\n output.appendChild(copy);\n break;\n }\n\n case 2: // Attribute\n if (output.nodeType === 1) {\n output.setAttribute(currentNode.name, currentNode.value);\n }\n break;\n\n case 3: // Text\n case 4: {\n // CDATA\n const textCopy = context.outputDocument.createTextNode(\n currentNode.nodeValue || \"\",\n );\n output.appendChild(textCopy);\n break;\n }\n\n case 7: {\n // Processing Instruction\n const piCopy = context.outputDocument.createProcessingInstruction(\n currentNode.target,\n currentNode.data,\n );\n output.appendChild(piCopy);\n break;\n }\n\n case 8: {\n // Comment\n const commentCopy = context.outputDocument.createComment(\n currentNode.nodeValue || \"\",\n );\n output.appendChild(commentCopy);\n break;\n }\n\n case 9: // Document\n case 11: // Document Fragment\n this.processChildren(node, context, output);\n break;\n }\n }\n\n xslCopyOf(node, context, output) {\n const select = node.getAttribute(\"select\");\n const result = this.evaluateXPath(select, context);\n\n this.copyToOutput(result, context, output);\n }\n\n copyToOutput(value, context, output) {\n if (Array.isArray(value)) {\n for (const item of value) {\n this.copyToOutput(item, context, output);\n }\n return;\n }\n\n if (value && value.nodeType) {\n // Deep copy node\n const clone = this.deepCloneNode(value, context.outputDocument);\n output.appendChild(clone);\n } else if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n const text = context.outputDocument.createTextNode(String(value));\n output.appendChild(text);\n }\n }\n\n deepCloneNode(node, targetDoc) {\n switch (node.nodeType) {\n case 1: {\n // Element\n let clone;\n if (node.namespaceURI && targetDoc.createElementNS) {\n clone = targetDoc.createElementNS(node.namespaceURI, node.nodeName);\n } else {\n clone = targetDoc.createElement(node.nodeName);\n }\n\n if (node.attributes) {\n for (const attr of node.attributes) {\n clone.setAttribute(attr.name, attr.value);\n }\n }\n\n for (const child of node.childNodes) {\n clone.appendChild(this.deepCloneNode(child, targetDoc));\n }\n\n return clone;\n }\n\n case 3: // Text\n case 4: // CDATA\n return targetDoc.createTextNode(node.nodeValue || \"\");\n\n case 7: // Processing Instruction\n return targetDoc.createProcessingInstruction(node.target, node.data);\n\n case 8: // Comment\n return targetDoc.createComment(node.nodeValue || \"\");\n\n case 11: {\n // Document Fragment\n const frag = targetDoc.createDocumentFragment();\n for (const child of node.childNodes) {\n frag.appendChild(this.deepCloneNode(child, targetDoc));\n }\n return frag;\n }\n\n default:\n return targetDoc.createTextNode(\"\");\n }\n }\n\n xslVariable(node, context, _output) {\n const name = node.getAttribute(\"name\");\n const select = node.getAttribute(\"select\");\n\n let value;\n if (select) {\n value = this.evaluateXPath(select, context);\n } else {\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(node, context, fragment);\n value = fragment;\n }\n\n context.setVariable(name, value);\n }\n\n xslComment(node, context, output) {\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(node, context, fragment);\n\n let text = \"\";\n const getText = (n) => {\n if (n.nodeType === 3 || n.nodeType === 4) {\n text += n.nodeValue || \"\";\n } else if (n.childNodes) {\n for (const child of n.childNodes) {\n getText(child);\n }\n }\n };\n getText(fragment);\n\n const comment = context.outputDocument.createComment(text);\n output.appendChild(comment);\n }\n\n xslProcessingInstruction(node, context, output) {\n const name = this.processAttributeValueTemplate(\n node.getAttribute(\"name\"),\n context,\n );\n\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(node, context, fragment);\n\n let data = \"\";\n const getText = (n) => {\n if (n.nodeType === 3 || n.nodeType === 4) {\n data += n.nodeValue || \"\";\n } else if (n.childNodes) {\n for (const child of n.childNodes) {\n getText(child);\n }\n }\n };\n getText(fragment);\n\n const pi = context.outputDocument.createProcessingInstruction(name, data);\n output.appendChild(pi);\n }\n\n xslNumber(node, context, output) {\n const value = node.getAttribute(\"value\");\n const format = node.getAttribute(\"format\") || \"1\";\n\n let numbers;\n if (value) {\n numbers = [\n Math.round(\n this.xpathEvaluator.toNumber(this.evaluateXPath(value, context)),\n ),\n ];\n } else {\n numbers = countXsltNumber(\n context.currentNode,\n {\n level: node.getAttribute(\"level\") || \"single\",\n count: node.getAttribute(\"count\"),\n from: node.getAttribute(\"from\"),\n },\n (candidate, pattern) =>\n this.matchesPattern(candidate, pattern, context),\n );\n }\n\n const text = context.outputDocument.createTextNode(\n formatXsltNumber(numbers, format),\n );\n output.appendChild(text);\n }\n\n /**\n * Format a single number with an `xsl:number` format token.\n *\n * @param {number} number - The number to format\n * @param {string} format - The format token, e.g. `1`, `01`, `a`, `I`\n * @returns {string} The formatted number\n */\n formatNumber(number, format) {\n return formatXsltNumber([number], format);\n }\n\n /**\n * Convert a number to an upper case Roman numeral.\n *\n * @param {number} num - The number to convert\n * @returns {string} The Roman numeral\n */\n toRoman(num) {\n return toRoman(num);\n }\n\n xslMessage(node, context, _output) {\n const terminate = node.getAttribute(\"terminate\") === \"yes\";\n\n const fragment = context.outputDocument.createDocumentFragment();\n this.processChildren(node, context, fragment);\n\n let text = \"\";\n const getText = (n) => {\n if (n.nodeType === 3 || n.nodeType === 4) {\n text += n.nodeValue || \"\";\n } else if (n.childNodes) {\n for (const child of n.childNodes) {\n getText(child);\n }\n }\n };\n getText(fragment);\n\n console.log(\"XSLT Message:\", text);\n\n if (terminate) {\n throw new Error(`XSLT terminated: ${text}`);\n }\n }\n\n applyAttributeSets(names, context, element) {\n const setNames = names.split(/\\s+/).filter(Boolean);\n\n for (const name of setNames) {\n const attrSet = this.attributeSets[name];\n if (attrSet) {\n // Apply inherited sets first\n if (attrSet.useAttributeSets.length > 0) {\n this.applyAttributeSets(\n attrSet.useAttributeSets.join(\" \"),\n context,\n element,\n );\n }\n\n // Apply attributes from this set\n for (const child of attrSet.node.childNodes) {\n if (child.nodeType === 1 && this.isXsltElement(child, \"attribute\")) {\n this.xslAttribute(child, context, element);\n }\n }\n }\n }\n }\n\n sortNodes(nodes, sortSpecs, context) {\n return [...nodes].sort((a, b) => {\n for (const spec of sortSpecs) {\n const contextA = context.clone({ currentNode: a });\n const contextB = context.clone({ currentNode: b });\n\n let valueA = this.evaluateXPath(spec.select, contextA);\n let valueB = this.evaluateXPath(spec.select, contextB);\n\n // Convert to string for comparison (ensure non-null values)\n valueA = this.xpathEvaluator.toString(valueA) || \"\";\n valueB = this.xpathEvaluator.toString(valueB) || \"\";\n\n if (spec.dataType === \"number\") {\n valueA = parseFloat(valueA) || 0;\n valueB = parseFloat(valueB) || 0;\n } else {\n // Text comparison\n if (spec.caseOrder === \"lower-first\") {\n valueA = valueA.toLowerCase();\n valueB = valueB.toLowerCase();\n } else {\n valueA = valueA.toUpperCase();\n valueB = valueB.toUpperCase();\n }\n }\n\n let cmp;\n if (typeof valueA === \"number\") {\n cmp = valueA - valueB;\n } else {\n cmp = valueA.localeCompare(valueB, spec.lang || undefined);\n }\n\n if (spec.order === \"descending\") {\n cmp = -cmp;\n }\n\n if (cmp !== 0) return cmp;\n }\n\n return 0;\n });\n }\n\n evaluateXPath(expr, context) {\n const ast = parseXPath(expr);\n const xpathContext = new XPathContext(\n context.currentNode,\n context.position,\n context.currentNodeList.length,\n { ...context.variables, ...context.parameters },\n context.namespaces,\n context,\n );\n return this.xpathEvaluator.evaluate(ast, xpathContext);\n }\n\n isXsltNamespace(node) {\n return (\n node.namespaceURI === XSLT_NS ||\n (node.nodeName && node.nodeName.startsWith(\"xsl:\"))\n );\n }\n\n isXsltElement(node, localName) {\n if (node.nodeType !== 1) return false;\n\n const nodeName = node.localName || node.nodeName;\n return (\n (node.namespaceURI === XSLT_NS && nodeName === localName) ||\n node.nodeName === `xsl:${localName}`\n );\n }\n}\n", "/**\n * XSLTProcessor - JavaScript Implementation\n *\n * Native-compatible XSLTProcessor implementation for browser environments.\n * Based on W3C DOM Level 3 XSL Transformations and XSLT 1.0 Specification.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/API/XSLTProcessor\n * XSLT 1.0: http://www.w3.org/TR/1999/REC-xslt-19991116\n * XPath 1.0: http://www.w3.org/TR/1999/REC-xpath-19991116\n *\n * This implementation provides 1:1 API compatibility with the native\n * browser XSLTProcessor. It can be used as a replacement when native\n * XSLT support is deprecated or unavailable.\n */\n\nimport { XsltEngine } from \"./xslt/engine.js\";\n\n/**\n * XSLTProcessor\n *\n * Applies XSLT stylesheet transformations to XML documents.\n *\n * @example\n * const processor = new XSLTProcessor();\n * processor.importStylesheet(xsltDoc);\n * const fragment = processor.transformToFragment(xmlDoc, document);\n */\nexport class XSLTProcessor {\n constructor() {\n this._engine = null;\n this._stylesheet = null;\n this._parameters = new Map();\n this._stylesheetLoader = null;\n this._documentLoader = null;\n }\n\n /**\n * The underlying XSLT engine (advanced usage).\n *\n * The engine is created lazily by {@link XSLTProcessor#importStylesheet},\n * so this getter returns `null` until a stylesheet has been imported.\n * Prefer the public {@link XSLTProcessor#setStylesheetLoader} over reaching\n * into the engine directly.\n *\n * @returns {import('./xslt/engine.js').XsltEngine|null} The engine, or null before import\n *\n * @example\n * processor.importStylesheet(xslDoc, '/styles/main.xsl');\n * console.log(processor.engine.outputSettings.method);\n */\n get engine() {\n return this._engine;\n }\n\n /**\n * Sets the loader used to resolve `xsl:import` and `xsl:include` references.\n *\n * The loader is synchronous: it MUST return the external stylesheet as a\n * `Document` or as an XML string (which is parsed automatically). Promises\n * are not awaited by the engine, so pre-load remote stylesheets before\n * calling `importStylesheet`.\n *\n * The loader may be set before or after `importStylesheet`. When set before,\n * it is passed to the engine on creation, which is required for the loader to\n * be used while the stylesheet is being compiled. When set after, the live\n * engine is updated as well.\n *\n * @param {((href: string, baseUri?: string) => (Document|string))|null} loader\n * The loader function, or null to remove a previously configured loader\n * @returns {XSLTProcessor} This processor, to allow chaining\n * @throws {TypeError} If the loader is neither a function nor null\n *\n * @example\n * processor.setStylesheetLoader((href) => readFileSync(href, 'utf8'));\n * processor.importStylesheet(mainStylesheet, '/styles/main.xsl');\n */\n setStylesheetLoader(loader) {\n if (\n loader !== null &&\n loader !== undefined &&\n typeof loader !== \"function\"\n ) {\n throw new TypeError(\n \"Failed to execute 'setStylesheetLoader' on 'XSLTProcessor': The loader argument must be a function or null.\",\n );\n }\n\n this._stylesheetLoader = loader ?? null;\n\n // Keep an already created engine in sync\n if (this._engine) {\n this._engine.setStylesheetLoader(this._stylesheetLoader);\n }\n\n return this;\n }\n\n /**\n * Sets the loader used to resolve the XSLT `document()` function.\n *\n * The loader is synchronous: it MUST return the referenced document as a\n * `Document`, as an XML string (which is parsed automatically) or as `null`\n * when the document cannot be provided. Returning `null`, like configuring no\n * loader at all, makes `document()` evaluate to an empty node-set rather than\n * failing the transformation.\n *\n * The loader may be set before or after `importStylesheet`; a live engine is\n * kept in sync.\n *\n * @param {((uri: string, baseUri?: string) => (Document|string|null))|null} loader\n * The loader function, or null to remove a previously configured loader\n * @returns {XSLTProcessor} This processor, to allow chaining\n * @throws {TypeError} If the loader is neither a function nor null\n *\n * @example\n * // Node.js: resolve document() against the file system\n * import { readFileSync } from 'node:fs';\n * processor.setDocumentLoader((uri) => readFileSync(uri, 'utf8'));\n * processor.importStylesheet(xslDoc, '/styles/main.xsl');\n */\n setDocumentLoader(loader) {\n if (\n loader !== null &&\n loader !== undefined &&\n typeof loader !== \"function\"\n ) {\n throw new TypeError(\n \"Failed to execute 'setDocumentLoader' on 'XSLTProcessor': The loader argument must be a function or null.\",\n );\n }\n\n this._documentLoader = loader ?? null;\n\n // Keep an already created engine in sync\n if (this._engine) {\n this._engine.setDocumentLoader(this._documentLoader);\n }\n\n return this;\n }\n\n /**\n * Imports the XSLT stylesheet.\n *\n * If the given node is a document node, you can pass in a full XSL Transform\n * or a literal result element transform; otherwise, it must be an\n * <xsl:stylesheet> or <xsl:transform> element.\n *\n * @param {Node} style - The XSLT stylesheet to import (Document or Element)\n * @param {string} [stylesheetUri] - Optional URI of the stylesheet, used as the\n * base URI when resolving relative `xsl:import`/`xsl:include` hrefs. When\n * omitted, hrefs are passed to the loader unresolved.\n * @returns {void}\n *\n * @example\n * const parser = new DOMParser();\n * const xslDoc = parser.parseFromString(xslText, 'application/xml');\n * processor.importStylesheet(xslDoc, '/styles/main.xsl');\n */\n importStylesheet(style, stylesheetUri) {\n if (!style) {\n throw new TypeError(\n \"Failed to execute 'importStylesheet' on 'XSLTProcessor': 1 argument required, but only 0 present.\",\n );\n }\n\n // Validate node type\n if (style.nodeType !== 1 && style.nodeType !== 9) {\n throw new TypeError(\n \"Failed to execute 'importStylesheet' on 'XSLTProcessor': The node provided is not a Document or Element.\",\n );\n }\n\n // Check for parser errors\n const errorNode = style.querySelector\n ? style.querySelector(\"parsererror\")\n : null;\n if (errorNode) {\n throw new Error(\"XSLT stylesheet contains parse errors\");\n }\n\n this._stylesheet = style;\n this._engine = new XsltEngine({\n stylesheetLoader: this._stylesheetLoader,\n documentLoader: this._documentLoader,\n });\n\n // Apply any previously set parameters\n for (const [key, value] of this._parameters) {\n this._engine.setParameterValue(key, value);\n }\n\n this._engine.importStylesheet(style, stylesheetUri);\n }\n\n /**\n * Transforms the node source by applying the XSLT stylesheet.\n * Returns a document fragment.\n *\n * @param {Node} source - The XML document to transform\n * @param {Document} output - The document that will own the generated fragment\n * @returns {DocumentFragment} The transformed result as a DocumentFragment\n *\n * @example\n * const fragment = processor.transformToFragment(xmlDoc, document);\n * document.getElementById('output').appendChild(fragment);\n */\n transformToFragment(source, output) {\n if (!source) {\n throw new TypeError(\n \"Failed to execute 'transformToFragment' on 'XSLTProcessor': 2 arguments required, but only 0 present.\",\n );\n }\n\n if (!output) {\n throw new TypeError(\n \"Failed to execute 'transformToFragment' on 'XSLTProcessor': 2 arguments required, but only 1 present.\",\n );\n }\n\n if (!this._engine || !this._stylesheet) {\n throw new Error(\n \"Failed to execute 'transformToFragment' on 'XSLTProcessor': No stylesheet has been imported.\",\n );\n }\n\n // Validate source node\n if (\n source.nodeType !== 1 &&\n source.nodeType !== 9 &&\n source.nodeType !== 11\n ) {\n throw new TypeError(\n \"Failed to execute 'transformToFragment' on 'XSLTProcessor': The source is not a valid node type.\",\n );\n }\n\n // Validate output document\n if (output.nodeType !== 9) {\n throw new TypeError(\n \"Failed to execute 'transformToFragment' on 'XSLTProcessor': The output is not a Document.\",\n );\n }\n\n try {\n return this._engine.transform(source, output);\n } catch (error) {\n // Match native behavior - return null on error\n console.error(\"XSLT transformation error:\", error);\n return null;\n }\n }\n\n /**\n * Transforms the node source by applying the XSLT stylesheet.\n * Returns a full XML document.\n *\n * @param {Node} source - The XML document to transform\n * @returns {XMLDocument} The transformed result as an XMLDocument\n *\n * @example\n * const resultDoc = processor.transformToDocument(xmlDoc);\n * const serialized = new XMLSerializer().serializeToString(resultDoc);\n */\n transformToDocument(source) {\n if (!source) {\n throw new TypeError(\n \"Failed to execute 'transformToDocument' on 'XSLTProcessor': 1 argument required, but only 0 present.\",\n );\n }\n\n if (!this._engine || !this._stylesheet) {\n throw new Error(\n \"Failed to execute 'transformToDocument' on 'XSLTProcessor': No stylesheet has been imported.\",\n );\n }\n\n // Validate source node\n if (\n source.nodeType !== 1 &&\n source.nodeType !== 9 &&\n source.nodeType !== 11\n ) {\n throw new TypeError(\n \"Failed to execute 'transformToDocument' on 'XSLTProcessor': The source is not a valid node type.\",\n );\n }\n\n try {\n return this._engine.transformToDocument(source);\n } catch (error) {\n // Match native behavior - return null on error\n console.error(\"XSLT transformation error:\", error);\n return null;\n }\n }\n\n /**\n * Transforms the node source by applying the XSLT stylesheet and serializes\n * the result to a string honoring the stylesheet `xsl:output` settings.\n *\n * Non-W3C convenience method: the native XSLTProcessor has no equivalent.\n * Output method, indentation, XML declaration, document type declaration,\n * CDATA sections and `disable-output-escaping` are all honored\n * (XSLT 1.0 section 16).\n *\n * @param {Node} source - The XML document to transform\n * @returns {string|null} The serialized result, or null on a transformation error\n *\n * @example\n * const xml = processor.transformToString(xmlDoc);\n * // '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<BAR>\\n <QUX/>\\n</BAR>'\n */\n transformToString(source) {\n if (!source) {\n throw new TypeError(\n \"Failed to execute 'transformToString' on 'XSLTProcessor': 1 argument required, but only 0 present.\",\n );\n }\n\n if (!this._engine || !this._stylesheet) {\n throw new Error(\n \"Failed to execute 'transformToString' on 'XSLTProcessor': No stylesheet has been imported.\",\n );\n }\n\n // Validate source node\n if (\n source.nodeType !== 1 &&\n source.nodeType !== 9 &&\n source.nodeType !== 11\n ) {\n throw new TypeError(\n \"Failed to execute 'transformToString' on 'XSLTProcessor': The source is not a valid node type.\",\n );\n }\n\n try {\n return this._engine.transformToString(source);\n } catch (error) {\n // Match transformToDocument behavior - return null on error\n console.error(\"XSLT transformation error:\", error);\n return null;\n }\n }\n\n /**\n * Sets a parameter in the XSLT stylesheet.\n *\n * @param {string|null} namespaceURI - The namespace URI of the XSLT parameter (use null for no namespace)\n * @param {string} localName - The local name of the parameter\n * @param {*} value - The value to set (string, number, boolean, or node-set)\n * @returns {void}\n *\n * @example\n * processor.setParameter(null, 'sortOrder', 'ascending');\n * processor.setParameter('http://example.com/ns', 'limit', 10);\n */\n setParameter(namespaceURI, localName, value) {\n if (arguments.length < 3) {\n throw new TypeError(\n `Failed to execute 'setParameter' on 'XSLTProcessor': 3 arguments required, but only ${arguments.length} present.`,\n );\n }\n\n if (typeof localName !== \"string\" || localName === \"\") {\n throw new TypeError(\n \"Failed to execute 'setParameter' on 'XSLTProcessor': The localName argument must be a non-empty string.\",\n );\n }\n\n const key = namespaceURI ? `{${namespaceURI}}${localName}` : localName;\n this._parameters.set(key, value);\n\n // If engine is already initialized, update it\n if (this._engine) {\n this._engine.setParameterValue(key, value);\n }\n }\n\n /**\n * Gets the value of a parameter from the XSLT stylesheet.\n *\n * @param {string|null} namespaceURI - The namespace URI of the parameter\n * @param {string} localName - The local name of the parameter\n * @returns {*} The parameter value, or empty string if not set\n *\n * @example\n * const sortOrder = processor.getParameter(null, 'sortOrder');\n */\n getParameter(namespaceURI, localName) {\n if (arguments.length < 2) {\n throw new TypeError(\n `Failed to execute 'getParameter' on 'XSLTProcessor': 2 arguments required, but only ${arguments.length} present.`,\n );\n }\n\n if (typeof localName !== \"string\") {\n throw new TypeError(\n \"Failed to execute 'getParameter' on 'XSLTProcessor': The localName argument must be a string.\",\n );\n }\n\n const key = namespaceURI ? `{${namespaceURI}}${localName}` : localName;\n\n if (this._parameters.has(key)) {\n return this._parameters.get(key);\n }\n\n // Return empty string for unset parameters (matches native behavior)\n return \"\";\n }\n\n /**\n * Removes a parameter from the XSLT processor.\n *\n * The XSLTProcessor will use the default value for the parameter\n * as specified in the XSLT stylesheet.\n *\n * @param {string|null} namespaceURI - The namespace URI of the parameter\n * @param {string} localName - The local name of the parameter\n * @returns {void}\n *\n * @example\n * processor.removeParameter(null, 'sortOrder');\n */\n removeParameter(namespaceURI, localName) {\n if (arguments.length < 2) {\n throw new TypeError(\n `Failed to execute 'removeParameter' on 'XSLTProcessor': 2 arguments required, but only ${arguments.length} present.`,\n );\n }\n\n if (typeof localName !== \"string\") {\n throw new TypeError(\n \"Failed to execute 'removeParameter' on 'XSLTProcessor': The localName argument must be a string.\",\n );\n }\n\n const key = namespaceURI ? `{${namespaceURI}}${localName}` : localName;\n this._parameters.delete(key);\n\n if (this._engine) {\n this._engine.clearParameterValue(key);\n }\n }\n\n /**\n * Removes all set parameters from the XSLTProcessor.\n *\n * The processor will use default values specified in the XSLT stylesheet.\n *\n * @returns {void}\n *\n * @example\n * processor.clearParameters();\n */\n clearParameters() {\n this._parameters.clear();\n\n if (this._engine) {\n this._engine.clearParameterValues();\n }\n }\n\n /**\n * Removes all parameters and stylesheets from the XSLTProcessor.\n *\n * Per the W3C `XSLTProcessor` semantics, `reset()` clears stylesheet state and\n * parameters only. The stylesheet and document loaders are processor\n * configuration rather than stylesheet state, so they are deliberately\n * preserved and stay effective for the next `importStylesheet()` call. Pass\n * `null` to {@link XSLTProcessor#setStylesheetLoader} or\n * {@link XSLTProcessor#setDocumentLoader} to remove them explicitly.\n *\n * @returns {void}\n *\n * @example\n * processor.reset();\n * // Now need to call importStylesheet() again before transforming\n */\n reset() {\n this._engine = null;\n this._stylesheet = null;\n this._parameters.clear();\n }\n}\n\n/**\n * Check if native XSLTProcessor is available and functional\n *\n * @returns {boolean} True if native XSLTProcessor works correctly\n */\nexport function isNativeXSLTSupported() {\n if (typeof globalThis.XSLTProcessor === \"undefined\") {\n return false;\n }\n\n try {\n const processor = new globalThis.XSLTProcessor();\n const parser = new DOMParser();\n\n const xslt = parser.parseFromString(\n `<?xml version=\"1.0\"?>\n <xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n <xsl:template match=\"/\"><test/></xsl:template>\n </xsl:stylesheet>`,\n \"application/xml\",\n );\n\n processor.importStylesheet(xslt);\n\n const xml = parser.parseFromString(\"<root/>\", \"application/xml\");\n const result = processor.transformToFragment(xml, document);\n\n return result !== null && result.childNodes.length > 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Install as global XSLTProcessor replacement if native is not functional\n *\n * @param {boolean} force - Force installation even if native is available\n * @returns {boolean} True if installed as global\n */\nexport function installGlobal(force = false) {\n if (!force && isNativeXSLTSupported()) {\n return false;\n }\n\n globalThis.XSLTProcessor = XSLTProcessor;\n return true;\n}\n\nexport default XSLTProcessor;\n", "/**\n * XPath 1.0 Module\n * Based on W3C XPath 1.0 Specification: http://www.w3.org/TR/1999/REC-xpath-19991116\n */\n\n\"use strict\";\n\nexport { TokenType, Token, XPathTokenizer, tokenize } from \"./tokenizer.js\";\nexport { NodeType, ASTNode, XPathParser, parse } from \"./parser.js\";\nexport {\n XPathResultType,\n XPathContext,\n XPathEvaluator,\n XPathLimits,\n} from \"./evaluator.js\";\n\nimport { parse } from \"./parser.js\";\nimport { XPathEvaluator, XPathContext } from \"./evaluator.js\";\n\n/**\n * Evaluate an XPath expression against a node\n *\n * @param {string} expression - XPath expression\n * @param {Node} contextNode - Context node\n * @param {Object} options - Options (variables, namespaces)\n * @returns {*} Evaluation result\n */\nexport function evaluate(expression, contextNode, options = {}) {\n const ast = parse(expression);\n const evaluator = new XPathEvaluator();\n const context = new XPathContext(\n contextNode,\n 1,\n 1,\n options.variables || {},\n options.namespaces || {},\n );\n return evaluator.evaluate(ast, context);\n}\n\n/**\n * Select nodes matching an XPath expression\n *\n * @param {string} expression - XPath expression\n * @param {Node} contextNode - Context node\n * @param {Object} options - Options\n * @returns {Node[]} Matching nodes\n */\nexport function select(expression, contextNode, options = {}) {\n const result = evaluate(expression, contextNode, options);\n if (Array.isArray(result)) return result;\n if (result && result.nodeType) return [result];\n return [];\n}\n\n/**\n * Select first node matching an XPath expression\n *\n * @param {string} expression - XPath expression\n * @param {Node} contextNode - Context node\n * @param {Object} options - Options\n * @returns {Node|null} First matching node or null\n */\nexport function selectFirst(expression, contextNode, options = {}) {\n const nodes = select(expression, contextNode, options);\n return nodes.length > 0 ? nodes[0] : null;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ns", "result", "evaluate", "select", "xpathContext", "result", "nodes"]
|
|
7
7
|
}
|