@tradik/xslt-processor 1.0.0
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/LICENSE +29 -0
- package/LICENSE.md +28 -0
- package/README.md +634 -0
- package/bin/xslt.js +208 -0
- package/dist/xslt-processor.browser.js +3302 -0
- package/dist/xslt-processor.browser.js.map +7 -0
- package/dist/xslt-processor.browser.min.js +6 -0
- package/dist/xslt-processor.browser.min.js.map +7 -0
- package/dist/xslt-processor.cjs +3311 -0
- package/dist/xslt-processor.cjs.map +7 -0
- package/dist/xslt-processor.d.ts +211 -0
- package/dist/xslt-processor.js +3271 -0
- package/dist/xslt-processor.js.map +7 -0
- package/package.json +68 -0
- package/src/XSLTProcessor.js +368 -0
- package/src/XSLTProcessor.test.js +930 -0
- package/src/index.js +66 -0
- package/src/xpath/evaluator.js +1012 -0
- package/src/xpath/evaluator.test.js +1852 -0
- package/src/xpath/index.js +67 -0
- package/src/xpath/parser.js +595 -0
- package/src/xpath/tokenizer.js +383 -0
- package/src/xpath/tokenizer.test.js +224 -0
- package/src/xslt/engine.js +1812 -0
- package/src/xslt/engine.test.js +3130 -0
- package/src/xslt/index.js +6 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
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\n const context = new XsltContext({\n currentNode: sourceNode.documentElement || sourceNode,\n currentNodeList: [sourceNode.documentElement || 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 root\n this.applyTemplates(\n [sourceNode.documentElement || sourceNode],\n null,\n context,\n fragment,\n );\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"]
|
|
7
|
+
}
|