xslt-processor 4.2.0 → 4.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/xpath/lib/src/lexer/token.ts","../src/xpath/lib/src/lexer/lexer.ts","../src/xpath/lib/src/expressions/expression.ts","../src/xpath/lib/src/expressions/literal-expression.ts","../src/xpath/lib/src/expressions/variable-reference-expression.ts","../src/xpath/lib/src/expressions/unary-expression.ts","../src/xpath/lib/src/expressions/binary-expression.ts","../src/xpath/lib/src/expressions/arithmetic-expression.ts","../src/xpath/lib/src/expressions/logical-expression.ts","../src/xpath/lib/src/expressions/step-expression.ts","../src/xpath/lib/src/expressions/predicate-expression.ts","../src/xpath/lib/src/expressions/location-path-expression.ts","../src/xpath/lib/src/expressions/filter-expression.ts","../src/xpath/lib/src/expressions/union-expression.ts","../src/xpath/lib/src/expressions/function-call-expression.ts","../src/xpath/lib/src/parser.ts","../src/xpath/lib/src/context.ts","../src/xpath/values/string-value.ts","../src/xpath/values/number-value.ts","../src/xpath/values/boolean-value.ts","../src/dom/functions.ts","../src/constants.ts","../src/dom/xnode.ts","../src/dom/xdocument.ts","../src/dom/xml-functions.ts","../src/dom/xml-parser.ts","../src/dom/xmltoken.ts","../src/xpath/values/node-set-value.ts","../src/xpath/xpath.ts","../src/xpath/tokens.ts","../src/xpath/expr-context.ts","../src/xpath/match-resolver.ts","../src/xpath/node-tests/node-test-any.ts","../src/xpath/node-tests/node-test-comment.ts","../src/xpath/node-tests/node-test-element-or-attribute.ts","../src/xpath/node-tests/node-test-name.ts","../src/xpath/node-tests/node-test-nc.ts","../src/xpath/node-tests/node-test-pi.ts","../src/xpath/node-tests/node-test-text.ts","../src/xslt/functions.ts","../src/xslt/xslt.ts"],"sourcesContent":["import { TokenType as XPathTokenType } from \"./token-type\";\r\n\r\nexport class XPathToken {\r\n type: XPathTokenType;\r\n lexeme: string;\r\n\r\n constructor(type: XPathTokenType, lexeme: string) {\r\n this.type = type;\r\n this.lexeme = lexeme;\r\n }\r\n}\r\n","import { XPathToken } from \"./token\";\r\n\r\nconst RESERVED_WORDS = {\r\n // Location axes (XPath 1.0 complete list)\r\n \"ancestor\": { type: \"LOCATION\", value: \"ancestor\" },\r\n \"ancestor-or-self\": { type: \"LOCATION\", value: \"ancestor-or-self\" },\r\n \"attribute\": { type: \"LOCATION\", value: \"attribute\" },\r\n \"child\": { type: \"LOCATION\", value: \"child\" },\r\n \"descendant\": { type: \"LOCATION\", value: \"descendant\" },\r\n \"descendant-or-self\": { type: \"LOCATION\", value: \"descendant-or-self\" },\r\n \"following\": { type: \"LOCATION\", value: \"following\" },\r\n \"following-sibling\": { type: \"LOCATION\", value: \"following-sibling\" },\r\n \"namespace\": { type: \"LOCATION\", value: \"namespace\" },\r\n \"parent\": { type: \"LOCATION\", value: \"parent\" },\r\n \"preceding\": { type: \"LOCATION\", value: \"preceding\" },\r\n \"preceding-sibling\": { type: \"LOCATION\", value: \"preceding-sibling\" },\r\n \"self\": { type: \"LOCATION\", value: \"self\" },\r\n\r\n // Node type tests\r\n \"node\": { type: \"NODE_TYPE\", value: \"node\" },\r\n \"text\": { type: \"NODE_TYPE\", value: \"text\" },\r\n \"comment\": { type: \"NODE_TYPE\", value: \"comment\" },\r\n \"processing-instruction\": { type: \"NODE_TYPE\", value: \"processing-instruction\" },\r\n\r\n // Operators\r\n \"and\": { type: \"OPERATOR\", value: \"and\" },\r\n \"or\": { type: \"OPERATOR\", value: \"or\" },\r\n \"div\": { type: \"OPERATOR\", value: \"div\" },\r\n \"mod\": { type: \"OPERATOR\", value: \"mod\" },\r\n\r\n // Node set functions\r\n \"last\": { type: \"FUNCTION\", value: \"last\" },\r\n \"position\": { type: \"FUNCTION\", value: \"position\" },\r\n \"count\": { type: \"FUNCTION\", value: \"count\" },\r\n \"id\": { type: \"FUNCTION\", value: \"id\" },\r\n \"local-name\": { type: \"FUNCTION\", value: \"local-name\" },\r\n \"namespace-uri\": { type: \"FUNCTION\", value: \"namespace-uri\" },\r\n \"name\": { type: \"FUNCTION\", value: \"name\" },\r\n\r\n // String functions\r\n \"string\": { type: \"FUNCTION\", value: \"string\" },\r\n \"concat\": { type: \"FUNCTION\", value: \"concat\" },\r\n \"starts-with\": { type: \"FUNCTION\", value: \"starts-with\" },\r\n \"contains\": { type: \"FUNCTION\", value: \"contains\" },\r\n \"substring-before\": { type: \"FUNCTION\", value: \"substring-before\" },\r\n \"substring-after\": { type: \"FUNCTION\", value: \"substring-after\" },\r\n \"substring\": { type: \"FUNCTION\", value: \"substring\" },\r\n \"string-length\": { type: \"FUNCTION\", value: \"string-length\" },\r\n \"normalize-space\": { type: \"FUNCTION\", value: \"normalize-space\" },\r\n \"translate\": { type: \"FUNCTION\", value: \"translate\" },\r\n\r\n // Boolean functions\r\n \"boolean\": { type: \"FUNCTION\", value: \"boolean\" },\r\n \"not\": { type: \"FUNCTION\", value: \"not\" },\r\n \"true\": { type: \"FUNCTION\", value: \"true\" },\r\n \"false\": { type: \"FUNCTION\", value: \"false\" },\r\n \"lang\": { type: \"FUNCTION\", value: \"lang\" },\r\n\r\n // Number functions\r\n \"number\": { type: \"FUNCTION\", value: \"number\" },\r\n \"sum\": { type: \"FUNCTION\", value: \"sum\" },\r\n \"floor\": { type: \"FUNCTION\", value: \"floor\" },\r\n \"ceiling\": { type: \"FUNCTION\", value: \"ceiling\" },\r\n \"round\": { type: \"FUNCTION\", value: \"round\" },\r\n\r\n // XSLT-specific functions (commonly used)\r\n \"document\": { type: \"FUNCTION\", value: \"document\" },\r\n \"key\": { type: \"FUNCTION\", value: \"key\" },\r\n \"format-number\": { type: \"FUNCTION\", value: \"format-number\" },\r\n \"current\": { type: \"FUNCTION\", value: \"current\" },\r\n \"unparsed-entity-uri\": { type: \"FUNCTION\", value: \"unparsed-entity-uri\" },\r\n \"generate-id\": { type: \"FUNCTION\", value: \"generate-id\" },\r\n \"system-property\": { type: \"FUNCTION\", value: \"system-property\" },\r\n \"element-available\": { type: \"FUNCTION\", value: \"element-available\" },\r\n \"function-available\": { type: \"FUNCTION\", value: \"function-available\" },\r\n};\r\n\r\nexport class XPathLexer {\r\n expression: string;\r\n current: number;\r\n tokens: XPathToken[];\r\n\r\n /**\r\n * Check if character is a valid start of an identifier.\r\n * Supports Unicode letters according to XML NCName specification.\r\n */\r\n isAlpha(char: string): boolean {\r\n // Allow ASCII letters, underscore, and Unicode letters\r\n // Using Unicode property escapes for broader Unicode support\r\n return /^[a-zA-Z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]$/.test(char);\r\n }\r\n\r\n /**\r\n * Check if character is valid in an identifier (after the first character).\r\n * Supports Unicode letters and digits according to XML NCName specification.\r\n * Note: Hyphen is handled separately in parseIdentifier for reserved words.\r\n */\r\n isAlphaNumeric(char: string): boolean {\r\n // Allow ASCII alphanumerics, underscore, and Unicode letters/digits/combining chars\r\n return /^[a-zA-Z0-9_\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0300-\\u036F\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]$/.test(char);\r\n }\r\n\r\n isNumber(char: string): boolean {\r\n return /^[0-9]$/.test(char);\r\n }\r\n\r\n isWhitespace(char: string): boolean {\r\n return /^[\\s\\t\\n\\r]$/.test(char);\r\n }\r\n\r\n peek(): string | undefined {\r\n return this.expression[this.current];\r\n }\r\n\r\n peekNext(): string | undefined {\r\n return this.expression[this.current + 1];\r\n }\r\n\r\n next(): string {\r\n return this.expression[this.current++];\r\n }\r\n\r\n match(expected: string): boolean {\r\n if (this.current >= this.expression.length) return false;\r\n if (this.expression[this.current] !== expected) return false;\r\n this.current++;\r\n return true;\r\n }\r\n\r\n parseIdentifier(firstCharacter: string): XPathToken {\r\n let characters = firstCharacter;\r\n\r\n // Parse alphanumeric characters, allowing hyphens for element names\r\n // XML NCName allows hyphens (but not at the start)\r\n while (this.current < this.expression.length) {\r\n const char = this.expression[this.current];\r\n\r\n if (this.isAlphaNumeric(char)) {\r\n characters += this.next();\r\n } else if (char === \"-\") {\r\n // Look ahead to check if this is a hyphenated identifier or subtraction\r\n const nextChar = this.expression[this.current + 1];\r\n\r\n // If hyphen is immediately followed by an alphanumeric character,\r\n // it's likely part of the identifier (e.g., \"my-element\", \"ancestor-or-self\")\r\n if (nextChar && this.isAlphaNumeric(nextChar)) {\r\n this.current++; // consume the hyphen\r\n characters += \"-\";\r\n // Continue parsing the rest of the identifier\r\n while (this.current < this.expression.length && this.isAlphaNumeric(this.expression[this.current])) {\r\n characters += this.next();\r\n }\r\n } else {\r\n // Hyphen followed by space or operator - it's subtraction\r\n break;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n const likelyReservedWord = RESERVED_WORDS[characters.toLowerCase()];\r\n if (likelyReservedWord) {\r\n return new XPathToken(likelyReservedWord.type, characters);\r\n }\r\n\r\n if (characters.length > 0) {\r\n return new XPathToken(\"IDENTIFIER\", characters);\r\n }\r\n\r\n throw new Error(`Invalid identifier: ${characters}`);\r\n }\r\n\r\n parseString(quoteChar: string): XPathToken {\r\n let value = \"\";\r\n\r\n while (this.current < this.expression.length && this.expression[this.current] !== quoteChar) {\r\n value += this.next();\r\n }\r\n\r\n if (this.current >= this.expression.length) {\r\n throw new Error(`Unterminated string literal`);\r\n }\r\n\r\n this.next(); // consume closing quote\r\n return new XPathToken(\"STRING\", value);\r\n }\r\n\r\n parseNumber(firstCharacter: string): XPathToken {\r\n let characters = firstCharacter;\r\n\r\n while (\r\n this.current < this.expression.length &&\r\n this.isNumber(this.expression[this.current]) &&\r\n this.expression[this.current] !== \".\"\r\n ) {\r\n characters += this.next();\r\n }\r\n\r\n // Allow for a decimal point in the number\r\n if (this.current < this.expression.length && this.expression[this.current] === \".\") {\r\n characters += this.next();\r\n while (\r\n this.current < this.expression.length &&\r\n this.isNumber(this.expression[this.current])\r\n ) {\r\n characters += this.next();\r\n }\r\n }\r\n\r\n if (characters.length > 0) {\r\n return new XPathToken(\"NUMBER\", characters);\r\n }\r\n\r\n // If no valid number was found, return an error token\r\n throw new Error(`Invalid number: ${characters}`);\r\n }\r\n\r\n scanToken(): XPathToken | null {\r\n const char = this.next();\r\n\r\n // Skip whitespace\r\n if (this.isWhitespace(char)) {\r\n return null;\r\n }\r\n\r\n switch (char) {\r\n case \"@\":\r\n return new XPathToken(\"AT\", char);\r\n case \"$\":\r\n return new XPathToken(\"DOLLAR\", char);\r\n case \"|\":\r\n return new XPathToken(\"PIPE\", char);\r\n case \"{\":\r\n return new XPathToken(\"OPEN_CURLY_BRACKET\", char);\r\n case \"}\":\r\n return new XPathToken(\"CLOSE_CURLY_BRACKET\", char);\r\n case \"[\":\r\n return new XPathToken(\"OPEN_SQUARE_BRACKET\", char);\r\n case \"]\":\r\n return new XPathToken(\"CLOSE_SQUARE_BRACKET\", char);\r\n case \"(\":\r\n return new XPathToken(\"OPEN_PAREN\", char);\r\n case \")\":\r\n return new XPathToken(\"CLOSE_PAREN\", char);\r\n case \"+\":\r\n return new XPathToken(\"PLUS\", char);\r\n case \"-\":\r\n return new XPathToken(\"MINUS\", char);\r\n case \"*\":\r\n return new XPathToken(\"ASTERISK\", char);\r\n case \",\":\r\n return new XPathToken(\"COMMA\", char);\r\n\r\n // Tokens that may be single or double character\r\n case \".\":\r\n if (this.match(\".\")) {\r\n return new XPathToken(\"DOT_DOT\", \"..\");\r\n }\r\n // Check if it's a number starting with decimal point\r\n if (this.peek() && this.isNumber(this.peek()!)) {\r\n return this.parseNumber(char);\r\n }\r\n return new XPathToken(\"DOT\", char);\r\n\r\n case \"/\":\r\n if (this.match(\"/\")) {\r\n return new XPathToken(\"DOUBLE_SLASH\", \"//\");\r\n }\r\n return new XPathToken(\"SLASH\", char);\r\n\r\n case \":\":\r\n if (this.match(\":\")) {\r\n return new XPathToken(\"COLON_COLON\", \"::\");\r\n }\r\n return new XPathToken(\"COLON\", char);\r\n\r\n case \"=\":\r\n return new XPathToken(\"EQUALS\", char);\r\n\r\n case \"!\":\r\n if (this.match(\"=\")) {\r\n return new XPathToken(\"NOT_EQUALS\", \"!=\");\r\n }\r\n throw new Error(`Unexpected character: ${char}`);\r\n\r\n case \"<\":\r\n if (this.match(\"=\")) {\r\n return new XPathToken(\"LESS_THAN_OR_EQUAL\", \"<=\");\r\n }\r\n return new XPathToken(\"LESS_THAN\", char);\r\n\r\n case \">\":\r\n if (this.match(\"=\")) {\r\n return new XPathToken(\"GREATER_THAN_OR_EQUAL\", \">=\");\r\n }\r\n return new XPathToken(\"GREATER_THAN\", char);\r\n\r\n // String literals\r\n case \"'\":\r\n return this.parseString(\"'\");\r\n\r\n case '\"':\r\n return this.parseString('\"');\r\n\r\n default:\r\n if (this.isNumber(char)) {\r\n return this.parseNumber(char);\r\n }\r\n\r\n if (this.isAlpha(char)) {\r\n return this.parseIdentifier(char);\r\n }\r\n\r\n throw new Error(`Unexpected character: ${char}`);\r\n }\r\n }\r\n\r\n scan(expression: string): XPathToken[] {\r\n this.expression = expression;\r\n this.tokens = [];\r\n this.current = 0;\r\n\r\n while (this.current < this.expression.length) {\r\n const token = this.scanToken();\r\n if (token !== null) {\r\n this.tokens.push(token);\r\n }\r\n }\r\n\r\n return this.tokens;\r\n }\r\n}\r\n","import { XPathContext, XPathResult } from '../context';\r\n\r\nexport abstract class XPathExpression {\r\n abstract evaluate(context: XPathContext): XPathResult;\r\n}\r\n","import { XPathContext } from '../context';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport class XPathStringLiteral extends XPathExpression {\r\n value: string;\r\n\r\n constructor(value: string) {\r\n super();\r\n this.value = value;\r\n }\r\n\r\n evaluate(_context: XPathContext): string {\r\n return this.value;\r\n }\r\n}\r\n\r\nexport class XPathNumberLiteral extends XPathExpression {\r\n value: number;\r\n\r\n constructor(value: number) {\r\n super();\r\n this.value = value;\r\n }\r\n\r\n evaluate(_context: XPathContext): number {\r\n return this.value;\r\n }\r\n}\r\n","import { XPathContext, XPathResult } from '../context';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport class XPathVariableReference extends XPathExpression {\r\n name: string;\r\n\r\n constructor(name: string) {\r\n super();\r\n this.name = name;\r\n }\r\n\r\n evaluate(context: XPathContext): XPathResult {\r\n if (!context.variables) {\r\n throw new Error(`Variable $${this.name} is not defined`);\r\n }\r\n\r\n if (!(this.name in context.variables)) {\r\n throw new Error(`Variable $${this.name} is not defined`);\r\n }\r\n\r\n return context.variables[this.name];\r\n }\r\n}\r\n","import { XPathContext } from '../context';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport class XPathUnaryExpression extends XPathExpression {\r\n operator: string;\r\n operand: XPathExpression;\r\n\r\n constructor(operator: string, operand: XPathExpression) {\r\n super();\r\n this.operator = operator;\r\n this.operand = operand;\r\n }\r\n\r\n evaluate(context: XPathContext): number {\r\n const value = this.operand.evaluate(context);\r\n\r\n switch (this.operator) {\r\n case '-':\r\n return -Number(value);\r\n default:\r\n throw new Error(`Unknown unary operator: ${this.operator}`);\r\n }\r\n }\r\n}\r\n","import { XPathContext } from '../context';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport class XPathBinaryExpression extends XPathExpression {\r\n left: XPathExpression;\r\n right: XPathExpression;\r\n operator: string;\r\n\r\n constructor(left: XPathExpression, right: XPathExpression, operator: string) {\r\n super();\r\n this.left = left;\r\n this.right = right;\r\n this.operator = operator;\r\n }\r\n\r\n evaluate(context: XPathContext): boolean {\r\n const leftValue = this.left.evaluate(context);\r\n const rightValue = this.right.evaluate(context);\r\n\r\n return this.compare(leftValue, rightValue, this.operator);\r\n }\r\n\r\n /**\r\n * XPath comparison rules:\r\n * - If both are node-sets: compare each node in left with each node in right\r\n * - If one is node-set and other is string: convert node-set to strings and compare\r\n * - If one is node-set and other is number: convert node-set to numbers and compare\r\n * - If one is node-set and other is boolean: convert node-set to boolean and compare\r\n * - Otherwise, convert both to numbers for numeric comparison, or strings for equality\r\n */\r\n private compare(left: any, right: any, operator: string): boolean {\r\n const leftIsNodeSet = Array.isArray(left);\r\n const rightIsNodeSet = Array.isArray(right);\r\n\r\n // Both are node-sets\r\n if (leftIsNodeSet && rightIsNodeSet) {\r\n return this.compareNodeSets(left, right, operator);\r\n }\r\n\r\n // Left is node-set\r\n if (leftIsNodeSet) {\r\n return this.compareNodeSetToValue(left, right, operator);\r\n }\r\n\r\n // Right is node-set\r\n if (rightIsNodeSet) {\r\n return this.compareValueToNodeSet(left, right, operator);\r\n }\r\n\r\n // Neither is a node-set\r\n return this.comparePrimitives(left, right, operator);\r\n }\r\n\r\n private compareNodeSets(left: any[], right: any[], operator: string): boolean {\r\n // For each node in left, compare with each node in right\r\n for (const leftNode of left) {\r\n const leftStr = this.getStringValue(leftNode);\r\n for (const rightNode of right) {\r\n const rightStr = this.getStringValue(rightNode);\r\n if (this.comparePrimitives(leftStr, rightStr, operator)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private compareNodeSetToValue(nodeSet: any[], value: any, operator: string): boolean {\r\n // Compare each node in the set to the value\r\n for (const node of nodeSet) {\r\n const nodeValue = typeof value === 'number'\r\n ? Number(this.getStringValue(node))\r\n : this.getStringValue(node);\r\n if (this.comparePrimitives(nodeValue, value, operator)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private compareValueToNodeSet(value: any, nodeSet: any[], operator: string): boolean {\r\n // Compare value to each node in the set\r\n for (const node of nodeSet) {\r\n const nodeValue = typeof value === 'number'\r\n ? Number(this.getStringValue(node))\r\n : this.getStringValue(node);\r\n if (this.comparePrimitives(value, nodeValue, operator)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private comparePrimitives(left: any, right: any, operator: string): boolean {\r\n // For equality operators, compare as-is (after node-set conversion)\r\n // For relational operators, convert to numbers\r\n switch (operator) {\r\n case '=':\r\n return left == right; // Use loose equality for type coercion\r\n case '!=':\r\n return left != right;\r\n case '<':\r\n return Number(left) < Number(right);\r\n case '>':\r\n return Number(left) > Number(right);\r\n case '<=':\r\n return Number(left) <= Number(right);\r\n case '>=':\r\n return Number(left) >= Number(right);\r\n default:\r\n throw new Error(`Unknown operator: ${operator}`);\r\n }\r\n }\r\n\r\n private getStringValue(node: any): string {\r\n if (!node) return '';\r\n\r\n // Text node or attribute\r\n if (node.nodeType === 3 || node.nodeType === 2) {\r\n return node.nodeValue || node.textContent || '';\r\n }\r\n\r\n // Element node - get text content\r\n if (node.textContent !== undefined) {\r\n return node.textContent;\r\n }\r\n\r\n // Fallback: recursively get text content\r\n if (node.childNodes) {\r\n let text = '';\r\n for (const child of Array.from(node.childNodes as ArrayLike<any>)) {\r\n if (child.nodeType === 3) {\r\n text += child.nodeValue || '';\r\n } else if (child.nodeType === 1) {\r\n text += this.getStringValue(child);\r\n }\r\n }\r\n return text;\r\n }\r\n\r\n return String(node);\r\n }\r\n}","import { XPathContext } from '../context';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport type ArithmeticOperator = '+' | '-' | '*' | 'div' | 'mod';\r\n\r\nexport class XPathArithmeticExpression extends XPathExpression {\r\n left: XPathExpression;\r\n right: XPathExpression;\r\n operator: ArithmeticOperator;\r\n\r\n constructor(left: XPathExpression, right: XPathExpression, operator: ArithmeticOperator) {\r\n super();\r\n this.left = left;\r\n this.right = right;\r\n this.operator = operator;\r\n }\r\n\r\n evaluate(context: XPathContext): number {\r\n const leftValue = Number(this.left.evaluate(context));\r\n const rightValue = Number(this.right.evaluate(context));\r\n\r\n switch (this.operator) {\r\n case '+':\r\n return leftValue + rightValue;\r\n case '-':\r\n return leftValue - rightValue;\r\n case '*':\r\n return leftValue * rightValue;\r\n case 'div':\r\n return leftValue / rightValue;\r\n case 'mod':\r\n return leftValue % rightValue;\r\n default:\r\n throw new Error(`Unknown arithmetic operator: ${this.operator}`);\r\n }\r\n }\r\n}\r\n","import { XPathContext, XPathResult } from '../context';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport class XPathLogicalExpression extends XPathExpression {\r\n left: XPathExpression;\r\n right: XPathExpression;\r\n operator: 'and' | 'or';\r\n\r\n constructor(left: XPathExpression, right: XPathExpression, operator: 'and' | 'or') {\r\n super();\r\n this.left = left;\r\n this.right = right;\r\n this.operator = operator;\r\n }\r\n\r\n private toBoolean(value: XPathResult): boolean {\r\n if (typeof value === 'boolean') {\r\n return value;\r\n }\r\n if (typeof value === 'number') {\r\n return value !== 0 && !isNaN(value);\r\n }\r\n if (typeof value === 'string') {\r\n return value.length > 0;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.length > 0;\r\n }\r\n return !!value;\r\n }\r\n\r\n evaluate(context: XPathContext): boolean {\r\n const leftValue = this.toBoolean(this.left.evaluate(context));\r\n\r\n // Short-circuit evaluation\r\n if (this.operator === 'and') {\r\n if (!leftValue) return false;\r\n return this.toBoolean(this.right.evaluate(context));\r\n }\r\n\r\n if (this.operator === 'or') {\r\n if (leftValue) return true;\r\n return this.toBoolean(this.right.evaluate(context));\r\n }\r\n\r\n throw new Error(`Unknown logical operator: ${this.operator}`);\r\n }\r\n}\r\n","import { XPathExpression } from './expression';\r\n\r\nexport type AxisType =\r\n | 'ancestor'\r\n | 'ancestor-or-self'\r\n | 'attribute'\r\n | 'child'\r\n | 'descendant'\r\n | 'descendant-or-self'\r\n | 'following'\r\n | 'following-sibling'\r\n | 'namespace'\r\n | 'parent'\r\n | 'preceding'\r\n | 'preceding-sibling'\r\n | 'self'\r\n | 'self-and-siblings'; // Custom axis for XSLT template matching\r\n\r\nexport interface NodeTest {\r\n type: 'name' | 'node-type' | 'wildcard' | 'processing-instruction';\r\n name?: string;\r\n nodeType?: 'node' | 'text' | 'comment' | 'processing-instruction';\r\n}\r\n\r\nexport class XPathStep extends XPathExpression {\r\n axis: AxisType;\r\n nodeTest: NodeTest;\r\n predicates: XPathExpression[];\r\n\r\n constructor(axis: AxisType, nodeTest: NodeTest, predicates: XPathExpression[] = []) {\r\n super();\r\n this.axis = axis;\r\n this.nodeTest = nodeTest;\r\n this.predicates = predicates;\r\n }\r\n\r\n evaluate(context: any): any[] {\r\n const node = context?.node;\r\n if (!node) return [];\r\n\r\n // Get candidate nodes based on axis\r\n let candidates = this.getNodesByAxis(node, context);\r\n\r\n // Filter by node test (pass context for namespace resolution)\r\n candidates = candidates.filter(n => this.matchesNodeTest(n, context));\r\n\r\n // Apply predicates\r\n candidates = this.applyPredicates(candidates, context);\r\n\r\n return candidates;\r\n }\r\n\r\n private getNodesByAxis(node: any, context?: any): any[] {\r\n switch (this.axis) {\r\n case 'child':\r\n // Filter out attribute nodes (nodeType 2) from childNodes\r\n return this.getChildNodes(node);\r\n\r\n case 'parent':\r\n return node.parentNode ? [node.parentNode] : [];\r\n\r\n case 'self':\r\n return [node];\r\n\r\n case 'attribute':\r\n // Attributes can be in a separate 'attributes' property or mixed in childNodes\r\n if (node.attributes) {\r\n return Array.from(node.attributes);\r\n }\r\n // Fallback: filter childNodes for attribute nodes\r\n return Array.from(node.childNodes || []).filter((n: any) => n.nodeType === 2);\r\n\r\n case 'descendant':\r\n return this.getDescendants(node, false);\r\n\r\n case 'descendant-or-self':\r\n return this.getDescendants(node, true);\r\n\r\n case 'ancestor':\r\n return this.getAncestors(node, false);\r\n\r\n case 'ancestor-or-self':\r\n return this.getAncestors(node, true);\r\n\r\n case 'following-sibling':\r\n return this.getFollowingSiblings(node);\r\n\r\n case 'preceding-sibling':\r\n return this.getPrecedingSiblings(node);\r\n\r\n case 'following':\r\n return this.getFollowing(node);\r\n\r\n case 'preceding':\r\n return this.getPreceding(node);\r\n\r\n case 'namespace':\r\n // Namespace axis is rarely used and implementation-specific\r\n return [];\r\n\r\n case 'self-and-siblings':\r\n // Custom axis for XSLT template matching\r\n // Returns all nodes in the context's nodeList (excluding attributes)\r\n if (context?.nodeList) {\r\n return context.nodeList.filter((n: any) => n.nodeType !== 2);\r\n }\r\n // Fallback: just return self\r\n return [node];\r\n\r\n default:\r\n return [];\r\n }\r\n }\r\n\r\n /**\r\n * Get child nodes excluding attribute nodes.\r\n * XNode stores attributes in childNodes, but XPath child axis doesn't include them.\r\n */\r\n private getChildNodes(node: any): any[] {\r\n const children = Array.from(node.childNodes || []);\r\n // Filter out attribute nodes (nodeType 2)\r\n return children.filter((n: any) => n.nodeType !== 2);\r\n }\r\n\r\n private getDescendants(node: any, includeSelf: boolean): any[] {\r\n const result: any[] = [];\r\n if (includeSelf) result.push(node);\r\n\r\n const walk = (n: any) => {\r\n // Use getChildNodes to exclude attribute nodes\r\n for (const child of this.getChildNodes(n)) {\r\n result.push(child);\r\n walk(child);\r\n }\r\n };\r\n walk(node);\r\n return result;\r\n }\r\n\r\n private getAncestors(node: any, includeSelf: boolean): any[] {\r\n const result: any[] = [];\r\n if (includeSelf) result.push(node);\r\n\r\n let current = node.parentNode;\r\n while (current) {\r\n result.push(current);\r\n current = current.parentNode;\r\n }\r\n return result;\r\n }\r\n\r\n private getFollowingSiblings(node: any): any[] {\r\n const result: any[] = [];\r\n let sibling = node.nextSibling;\r\n while (sibling) {\r\n result.push(sibling);\r\n sibling = sibling.nextSibling;\r\n }\r\n return result;\r\n }\r\n\r\n private getPrecedingSiblings(node: any): any[] {\r\n const result: any[] = [];\r\n let sibling = node.previousSibling;\r\n while (sibling) {\r\n result.unshift(sibling);\r\n sibling = sibling.previousSibling;\r\n }\r\n return result;\r\n }\r\n\r\n private getFollowing(node: any): any[] {\r\n const result: any[] = [];\r\n\r\n // First, following siblings and their descendants\r\n let sibling = node.nextSibling;\r\n while (sibling) {\r\n result.push(sibling);\r\n result.push(...this.getDescendants(sibling, false));\r\n sibling = sibling.nextSibling;\r\n }\r\n\r\n // Then ancestors' following siblings\r\n let ancestor = node.parentNode;\r\n while (ancestor) {\r\n sibling = ancestor.nextSibling;\r\n while (sibling) {\r\n result.push(sibling);\r\n result.push(...this.getDescendants(sibling, false));\r\n sibling = sibling.nextSibling;\r\n }\r\n ancestor = ancestor.parentNode;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private getPreceding(node: any): any[] {\r\n const result: any[] = [];\r\n\r\n // Preceding siblings and their descendants (in reverse document order)\r\n let sibling = node.previousSibling;\r\n while (sibling) {\r\n result.unshift(sibling);\r\n const descendants = this.getDescendants(sibling, false);\r\n result.unshift(...descendants);\r\n sibling = sibling.previousSibling;\r\n }\r\n\r\n // Ancestors' preceding siblings\r\n let ancestor = node.parentNode;\r\n while (ancestor) {\r\n sibling = ancestor.previousSibling;\r\n while (sibling) {\r\n result.unshift(sibling);\r\n const descendants = this.getDescendants(sibling, false);\r\n result.unshift(...descendants);\r\n sibling = sibling.previousSibling;\r\n }\r\n ancestor = ancestor.parentNode;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private matchesNodeTest(node: any, context?: any): boolean {\r\n const nodeType = node.nodeType;\r\n\r\n switch (this.nodeTest.type) {\r\n case 'wildcard':\r\n // Check if it's a namespaced wildcard like \"ns:*\"\r\n if (this.nodeTest.name && this.nodeTest.name.endsWith(':*')) {\r\n const prefix = this.nodeTest.name.slice(0, -2);\r\n const nsUri = context?.namespaces?.[prefix];\r\n if (!nsUri) return false; // Unknown prefix - no match\r\n\r\n const nodeNsUri = node.namespaceURI || node.namespaceUri || '';\r\n return (nodeType === 1 || nodeType === 2) && nodeNsUri === nsUri;\r\n }\r\n // Regular wildcard - matches any element (nodeType 1) or attribute (nodeType 2)\r\n return nodeType === 1 || nodeType === 2;\r\n\r\n case 'name':\r\n // Match element or attribute by name\r\n if (nodeType !== 1 && nodeType !== 2) return false;\r\n\r\n const testName = this.nodeTest.name!;\r\n const colonIndex = testName.indexOf(':');\r\n\r\n if (colonIndex > 0) {\r\n // Prefixed name like \"xhtml:root\" or \"atom:title\"\r\n const prefix = testName.substring(0, colonIndex);\r\n const localName = testName.substring(colonIndex + 1);\r\n const nsUri = context?.namespaces?.[prefix];\r\n\r\n if (!nsUri) {\r\n // Unknown prefix - no match\r\n return false;\r\n }\r\n\r\n // Match both local name AND namespace URI\r\n const nodeLocalName = node.localName || node.nodeName;\r\n const nodeNsUri = node.namespaceURI || node.namespaceUri || '';\r\n\r\n return nodeLocalName === localName && nodeNsUri === nsUri;\r\n }\r\n\r\n // Unprefixed name - match by local name only\r\n const nodeName = node.localName || node.nodeName;\r\n return nodeName === testName;\r\n\r\n case 'node-type':\r\n switch (this.nodeTest.nodeType) {\r\n case 'node':\r\n return true; // matches any node\r\n case 'text':\r\n return nodeType === 3; // text node\r\n case 'comment':\r\n return nodeType === 8; // comment node\r\n case 'processing-instruction':\r\n return nodeType === 7; // processing instruction\r\n default:\r\n return false;\r\n }\r\n\r\n case 'processing-instruction':\r\n if (nodeType !== 7) return false;\r\n if (this.nodeTest.name) {\r\n return node.target === this.nodeTest.name;\r\n }\r\n return true;\r\n\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private applyPredicates(nodes: any[], context: any): any[] {\r\n let result = nodes;\r\n\r\n for (const predicate of this.predicates) {\r\n const filtered: any[] = [];\r\n const size = result.length;\r\n\r\n for (let i = 0; i < result.length; i++) {\r\n const predicateContext = {\r\n ...context,\r\n node: result[i],\r\n position: i + 1,\r\n size: size,\r\n };\r\n\r\n const predicateResult = predicate.evaluate(predicateContext);\r\n\r\n // If predicate result is a number, it's a position test\r\n if (typeof predicateResult === 'number') {\r\n if (predicateResult === i + 1) {\r\n filtered.push(result[i]);\r\n }\r\n } else if (this.toBoolean(predicateResult)) {\r\n filtered.push(result[i]);\r\n }\r\n }\r\n\r\n result = filtered;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private toBoolean(value: any): boolean {\r\n if (typeof value === 'boolean') return value;\r\n if (typeof value === 'number') return value !== 0 && !isNaN(value);\r\n if (typeof value === 'string') return value.length > 0;\r\n if (Array.isArray(value)) return value.length > 0;\r\n return !!value;\r\n }\r\n}\r\n","import { XPathExpression } from './expression';\r\n\r\nexport class XPathPredicate extends XPathExpression {\r\n expression: XPathExpression;\r\n\r\n constructor(expression: XPathExpression) {\r\n super();\r\n this.expression = expression;\r\n }\r\n\r\n evaluate(context: any): any {\r\n return this.expression.evaluate(context);\r\n }\r\n\r\n test(context: any): boolean {\r\n const result = this.evaluate(context);\r\n\r\n // If the result is a number, compare with position\r\n if (typeof result === 'number') {\r\n return result === context?.position;\r\n }\r\n\r\n // Otherwise convert to boolean\r\n return this.toBoolean(result);\r\n }\r\n\r\n private toBoolean(value: any): boolean {\r\n if (typeof value === 'boolean') return value;\r\n if (typeof value === 'number') return value !== 0 && !isNaN(value);\r\n if (typeof value === 'string') return value.length > 0;\r\n if (Array.isArray(value)) return value.length > 0;\r\n return !!value;\r\n }\r\n}\r\n","import { XPathExpression } from './expression';\r\nimport { XPathStep } from './step-expression';\r\n\r\nexport class XPathLocationPath extends XPathExpression {\r\n steps: XPathStep[];\r\n absolute: boolean;\r\n\r\n constructor(steps: XPathStep[], absolute: boolean = false) {\r\n super();\r\n this.steps = steps;\r\n this.absolute = absolute;\r\n }\r\n\r\n evaluate(context: any): any[] {\r\n let nodes: any[];\r\n\r\n if (this.absolute) {\r\n // Start from document root\r\n const root = this.getDocumentRoot(context?.node);\r\n nodes = root ? [root] : [];\r\n } else {\r\n // Start from context node\r\n nodes = context?.node ? [context.node] : [];\r\n }\r\n\r\n // Apply each step\r\n for (const step of this.steps) {\r\n const nextNodes: any[] = [];\r\n\r\n for (const node of nodes) {\r\n const stepContext = { ...context, node };\r\n const result = step.evaluate(stepContext);\r\n nextNodes.push(...result);\r\n }\r\n\r\n // Remove duplicates while preserving document order\r\n nodes = this.uniqueNodes(nextNodes);\r\n }\r\n\r\n return nodes;\r\n }\r\n\r\n private getDocumentRoot(node: any): any {\r\n if (!node) return null;\r\n\r\n let root = node;\r\n while (root.parentNode) {\r\n root = root.parentNode;\r\n }\r\n\r\n // Return the document node itself (not the document element)\r\n // In XPath, \"/\" represents the document node, and \"/test\" selects\r\n // children of the document node named \"test\"\r\n return root;\r\n }\r\n\r\n private uniqueNodes(nodes: any[]): any[] {\r\n const seen = new Set();\r\n const result: any[] = [];\r\n\r\n for (const node of nodes) {\r\n if (!seen.has(node)) {\r\n seen.add(node);\r\n result.push(node);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { XPathExpression } from './expression';\r\n\r\nexport class XPathFilterExpression extends XPathExpression {\r\n expression: XPathExpression;\r\n predicate: XPathExpression;\r\n\r\n constructor(expression: XPathExpression, predicate: XPathExpression) {\r\n super();\r\n this.expression = expression;\r\n this.predicate = predicate;\r\n }\r\n\r\n evaluate(context: any): any[] {\r\n /* const result = this.expression.evaluate(context);\r\n return result.filter(item => this.predicate.evaluate(item)); */\r\n return [];\r\n }\r\n}\r\n","import { XPathExpression } from './expression';\r\n\r\nexport class XPathUnionExpression extends XPathExpression {\r\n left: XPathExpression;\r\n right: XPathExpression;\r\n\r\n constructor(left: XPathExpression, right: XPathExpression) {\r\n super();\r\n this.left = left;\r\n this.right = right;\r\n }\r\n\r\n evaluate(context: any): any[] {\r\n const leftResult = this.left.evaluate(context);\r\n const rightResult = this.right.evaluate(context);\r\n\r\n // Both operands must be node-sets\r\n const leftNodes = Array.isArray(leftResult) ? leftResult : [];\r\n const rightNodes = Array.isArray(rightResult) ? rightResult : [];\r\n\r\n // Combine and remove duplicates, preserving document order\r\n return this.unionNodes(leftNodes, rightNodes);\r\n }\r\n\r\n private unionNodes(left: any[], right: any[]): any[] {\r\n const seen = new Set();\r\n const result: any[] = [];\r\n\r\n // Add left nodes\r\n for (const node of left) {\r\n if (!seen.has(node)) {\r\n seen.add(node);\r\n result.push(node);\r\n }\r\n }\r\n\r\n // Add right nodes not already in result\r\n for (const node of right) {\r\n if (!seen.has(node)) {\r\n seen.add(node);\r\n result.push(node);\r\n }\r\n }\r\n\r\n // Sort by document order\r\n return this.sortByDocumentOrder(result);\r\n }\r\n\r\n private sortByDocumentOrder(nodes: any[]): any[] {\r\n return nodes.sort((a, b) => {\r\n if (a === b) return 0;\r\n\r\n // Use compareDocumentPosition if available (DOM Level 3)\r\n if (typeof a.compareDocumentPosition === 'function') {\r\n const position = a.compareDocumentPosition(b);\r\n if (position & 4) return -1; // b follows a\r\n if (position & 2) return 1; // a follows b\r\n }\r\n\r\n return 0;\r\n });\r\n }\r\n}\r\n","import { XPathContext, XPathResult } from '../context';\r\nimport { XPathNode } from '../node';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport class XPathFunctionCall extends XPathExpression {\r\n name: string;\r\n args: XPathExpression[];\r\n\r\n constructor(name: string, args: XPathExpression[]) {\r\n super();\r\n this.name = name;\r\n this.args = args;\r\n }\r\n\r\n evaluate(context: XPathContext): XPathResult {\r\n const evaluatedArgs = this.args.map(arg => arg.evaluate(context));\r\n\r\n // Built-in XPath 1.0 functions\r\n switch (this.name) {\r\n // Node set functions\r\n case 'last':\r\n return context.size ?? 0;\r\n case 'position':\r\n return context.position ?? 0;\r\n case 'count':\r\n return Array.isArray(evaluatedArgs[0]) ? evaluatedArgs[0].length : 0;\r\n case 'local-name':\r\n return this.localName(evaluatedArgs, context);\r\n case 'namespace-uri':\r\n return this.namespaceUri(evaluatedArgs, context);\r\n case 'name':\r\n return this.nodeName(evaluatedArgs, context);\r\n\r\n // String functions\r\n case 'string':\r\n return this.stringValue(evaluatedArgs, context);\r\n case 'concat':\r\n return evaluatedArgs.map(String).join('');\r\n case 'starts-with':\r\n return String(evaluatedArgs[0]).startsWith(String(evaluatedArgs[1]));\r\n case 'contains':\r\n return String(evaluatedArgs[0]).includes(String(evaluatedArgs[1]));\r\n case 'substring-before':\r\n return this.substringBefore(evaluatedArgs);\r\n case 'substring-after':\r\n return this.substringAfter(evaluatedArgs);\r\n case 'substring':\r\n return this.substring(evaluatedArgs);\r\n case 'string-length':\r\n return this.stringLength(evaluatedArgs, context);\r\n case 'normalize-space':\r\n return this.normalizeSpace(evaluatedArgs, context);\r\n case 'translate':\r\n return this.translate(evaluatedArgs);\r\n\r\n // Boolean functions\r\n case 'boolean':\r\n return this.toBoolean(evaluatedArgs[0]);\r\n case 'not':\r\n return !this.toBoolean(evaluatedArgs[0]);\r\n case 'true':\r\n return true;\r\n case 'false':\r\n return false;\r\n case 'lang':\r\n return this.lang(evaluatedArgs, context);\r\n\r\n // Number functions\r\n case 'number':\r\n return this.toNumber(evaluatedArgs, context);\r\n case 'sum':\r\n return this.sum(evaluatedArgs);\r\n case 'floor':\r\n return Math.floor(Number(evaluatedArgs[0]));\r\n case 'ceiling':\r\n return Math.ceil(Number(evaluatedArgs[0]));\r\n case 'round':\r\n return Math.round(Number(evaluatedArgs[0]));\r\n\r\n default:\r\n // Check for custom functions in context\r\n if (context.functions && typeof context.functions[this.name] === 'function') {\r\n return context.functions[this.name](...evaluatedArgs);\r\n }\r\n throw new Error(`Unknown function: ${this.name}`);\r\n }\r\n }\r\n\r\n private toBoolean(value: XPathResult): boolean {\r\n if (typeof value === 'boolean') return value;\r\n if (typeof value === 'number') return value !== 0 && !isNaN(value);\r\n if (typeof value === 'string') return value.length > 0;\r\n if (Array.isArray(value)) return value.length > 0;\r\n return !!value;\r\n }\r\n\r\n private toNumber(args: XPathResult[], context: XPathContext): number {\r\n if (args.length === 0) {\r\n return Number(this.stringValue([], context));\r\n }\r\n return Number(args[0]);\r\n }\r\n\r\n private stringValue(args: XPathResult[], context: XPathContext): string {\r\n if (args.length === 0) {\r\n return context.node?.textContent ?? '';\r\n }\r\n const value = args[0];\r\n if (Array.isArray(value) && value.length > 0) {\r\n return value[0]?.textContent ?? String(value[0]);\r\n }\r\n return String(value);\r\n }\r\n\r\n private stringLength(args: XPathResult[], context: XPathContext): number {\r\n if (args.length === 0) {\r\n return this.stringValue([], context).length;\r\n }\r\n return String(args[0]).length;\r\n }\r\n\r\n private normalizeSpace(args: XPathResult[], context: XPathContext): string {\r\n const str = args.length === 0 ? this.stringValue([], context) : String(args[0]);\r\n return str.trim().replace(/\\s+/g, ' ');\r\n }\r\n\r\n private substringBefore(args: XPathResult[]): string {\r\n const str = String(args[0]);\r\n const search = String(args[1]);\r\n const index = str.indexOf(search);\r\n return index === -1 ? '' : str.substring(0, index);\r\n }\r\n\r\n private substringAfter(args: XPathResult[]): string {\r\n const str = String(args[0]);\r\n const search = String(args[1]);\r\n const index = str.indexOf(search);\r\n return index === -1 ? '' : str.substring(index + search.length);\r\n }\r\n\r\n private substring(args: XPathResult[]): string {\r\n const str = String(args[0]);\r\n // XPath uses 1-based indexing and rounds\r\n const start = Math.round(Number(args[1])) - 1;\r\n if (args.length === 2) {\r\n return str.substring(Math.max(0, start));\r\n }\r\n const length = Math.round(Number(args[2]));\r\n const adjustedStart = Math.max(0, start);\r\n const adjustedLength = Math.min(length - (adjustedStart - start), str.length - adjustedStart);\r\n return str.substring(adjustedStart, adjustedStart + adjustedLength);\r\n }\r\n\r\n private translate(args: XPathResult[]): string {\r\n const str = String(args[0]);\r\n const from = String(args[1]);\r\n const to = String(args[2]);\r\n let result = '';\r\n for (const char of str) {\r\n const index = from.indexOf(char);\r\n if (index === -1) {\r\n result += char;\r\n } else if (index < to.length) {\r\n result += to[index];\r\n }\r\n // If index >= to.length, character is removed\r\n }\r\n return result;\r\n }\r\n\r\n private localName(args: XPathResult[], context: XPathContext): string {\r\n const node = this.getNodeArg(args, context);\r\n return node?.localName ?? '';\r\n }\r\n\r\n private namespaceUri(args: XPathResult[], context: XPathContext): string {\r\n const node = this.getNodeArg(args, context);\r\n return node?.namespaceURI ?? '';\r\n }\r\n\r\n private nodeName(args: XPathResult[], context: XPathContext): string {\r\n const node = this.getNodeArg(args, context);\r\n return node?.nodeName ?? '';\r\n }\r\n\r\n private getNodeArg(args: XPathResult[], context: XPathContext): XPathNode | undefined {\r\n if (args.length > 0 && Array.isArray(args[0]) && args[0].length > 0) {\r\n return args[0][0];\r\n }\r\n return context.node;\r\n }\r\n\r\n private sum(args: XPathResult[]): number {\r\n const nodeSet = args[0];\r\n if (!Array.isArray(nodeSet)) return 0;\r\n return nodeSet.reduce((acc: number, node: XPathNode) => {\r\n const value = Number(node?.textContent ?? node);\r\n return acc + (isNaN(value) ? 0 : value);\r\n }, 0);\r\n }\r\n\r\n private lang(args: XPathResult[], context: XPathContext): boolean {\r\n const targetLang = String(args[0]).toLowerCase();\r\n let node = context.node;\r\n while (node) {\r\n const lang = node.getAttribute?.('xml:lang') || node.getAttribute?.('lang');\r\n if (lang) {\r\n const nodeLang = lang.toLowerCase();\r\n return nodeLang === targetLang || nodeLang.startsWith(targetLang + '-');\r\n }\r\n node = node.parentNode as XPathNode | undefined;\r\n }\r\n return false;\r\n }\r\n}\r\n","import { XPathToken } from './lexer/token';\r\nimport { TokenType } from './lexer/token-type';\r\nimport {\r\n XPathExpression,\r\n XPathStringLiteral,\r\n XPathNumberLiteral,\r\n XPathVariableReference,\r\n XPathUnaryExpression,\r\n XPathArithmeticExpression,\r\n ArithmeticOperator,\r\n XPathBinaryExpression,\r\n XPathLogicalExpression,\r\n XPathFunctionCall,\r\n XPathStep,\r\n AxisType,\r\n NodeTest,\r\n XPathPredicate,\r\n XPathLocationPath,\r\n XPathFilterExpression,\r\n XPathUnionExpression,\r\n} from './expressions';\r\n\r\n/**\r\n * Recursive descent parser for XPath 1.0 expressions.\r\n *\r\n * Grammar (simplified):\r\n * Expr ::= OrExpr\r\n * OrExpr ::= AndExpr ('or' AndExpr)*\r\n * AndExpr ::= EqualityExpr ('and' EqualityExpr)*\r\n * EqualityExpr ::= RelationalExpr (('=' | '!=') RelationalExpr)*\r\n * RelationalExpr ::= AdditiveExpr (('<' | '>' | '<=' | '>=') AdditiveExpr)*\r\n * AdditiveExpr ::= MultiplicativeExpr (('+' | '-') MultiplicativeExpr)*\r\n * MultiplicativeExpr ::= UnaryExpr (('*' | 'div' | 'mod') UnaryExpr)*\r\n * UnaryExpr ::= '-'* UnionExpr\r\n * UnionExpr ::= PathExpr ('|' PathExpr)*\r\n * PathExpr ::= LocationPath | FilterExpr (('/' | '//') RelativeLocationPath)?\r\n * FilterExpr ::= PrimaryExpr Predicate*\r\n * PrimaryExpr ::= VariableReference | '(' Expr ')' | Literal | Number | FunctionCall\r\n * LocationPath ::= RelativeLocationPath | AbsoluteLocationPath\r\n * Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep\r\n * Predicate ::= '[' Expr ']'\r\n */\r\nexport class XPathParser {\r\n private tokens: XPathToken[] = [];\r\n private current: number = 0;\r\n\r\n parse(tokens: XPathToken[]): XPathExpression {\r\n this.tokens = tokens;\r\n this.current = 0;\r\n\r\n if (tokens.length === 0) {\r\n throw new Error('Empty expression');\r\n }\r\n\r\n const expr = this.parseExpr();\r\n\r\n if (!this.isAtEnd()) {\r\n throw new Error(`Unexpected token: ${this.peek().lexeme}`);\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n // ==================== Token Management ====================\r\n\r\n private peek(): XPathToken {\r\n return this.tokens[this.current];\r\n }\r\n\r\n private peekNext(): XPathToken | undefined {\r\n return this.tokens[this.current + 1];\r\n }\r\n\r\n private previous(): XPathToken {\r\n return this.tokens[this.current - 1];\r\n }\r\n\r\n private isAtEnd(): boolean {\r\n return this.current >= this.tokens.length;\r\n }\r\n\r\n private advance(): XPathToken {\r\n if (!this.isAtEnd()) this.current++;\r\n return this.previous();\r\n }\r\n\r\n private check(type: TokenType): boolean {\r\n if (this.isAtEnd()) return false;\r\n return this.peek().type === type;\r\n }\r\n\r\n private checkLexeme(lexeme: string): boolean {\r\n if (this.isAtEnd()) return false;\r\n return this.peek().lexeme === lexeme;\r\n }\r\n\r\n private match(...types: TokenType[]): boolean {\r\n for (const type of types) {\r\n if (this.check(type)) {\r\n this.advance();\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private consume(type: TokenType, message: string): XPathToken {\r\n if (this.check(type)) return this.advance();\r\n throw new Error(`${message}. Got: ${this.peek()?.lexeme ?? 'EOF'}`);\r\n }\r\n\r\n // ==================== Expression Parsing ====================\r\n\r\n private parseExpr(): XPathExpression {\r\n return this.parseOrExpr();\r\n }\r\n\r\n private parseOrExpr(): XPathExpression {\r\n let left = this.parseAndExpr();\r\n\r\n while (this.check('OPERATOR') && this.peek().lexeme === 'or') {\r\n this.advance();\r\n const right = this.parseAndExpr();\r\n left = new XPathLogicalExpression(left, right, 'or');\r\n }\r\n\r\n return left;\r\n }\r\n\r\n private parseAndExpr(): XPathExpression {\r\n let left = this.parseEqualityExpr();\r\n\r\n while (this.check('OPERATOR') && this.peek().lexeme === 'and') {\r\n this.advance();\r\n const right = this.parseEqualityExpr();\r\n left = new XPathLogicalExpression(left, right, 'and');\r\n }\r\n\r\n return left;\r\n }\r\n\r\n private parseEqualityExpr(): XPathExpression {\r\n let left = this.parseRelationalExpr();\r\n\r\n while (this.match('EQUALS', 'NOT_EQUALS')) {\r\n const operator = this.previous().lexeme;\r\n const right = this.parseRelationalExpr();\r\n left = new XPathBinaryExpression(left, right, operator);\r\n }\r\n\r\n return left;\r\n }\r\n\r\n private parseRelationalExpr(): XPathExpression {\r\n let left = this.parseAdditiveExpr();\r\n\r\n while (this.match('LESS_THAN', 'GREATER_THAN', 'LESS_THAN_OR_EQUAL', 'GREATER_THAN_OR_EQUAL')) {\r\n const operator = this.previous().lexeme;\r\n const right = this.parseAdditiveExpr();\r\n left = new XPathBinaryExpression(left, right, operator);\r\n }\r\n\r\n return left;\r\n }\r\n\r\n private parseAdditiveExpr(): XPathExpression {\r\n let left = this.parseMultiplicativeExpr();\r\n\r\n while (this.match('PLUS', 'MINUS')) {\r\n const operator = this.previous().lexeme as ArithmeticOperator;\r\n const right = this.parseMultiplicativeExpr();\r\n left = new XPathArithmeticExpression(left, right, operator);\r\n }\r\n\r\n return left;\r\n }\r\n\r\n private parseMultiplicativeExpr(): XPathExpression {\r\n let left = this.parseUnaryExpr();\r\n\r\n while (true) {\r\n if (this.match('ASTERISK')) {\r\n const right = this.parseUnaryExpr();\r\n left = new XPathArithmeticExpression(left, right, '*');\r\n } else if (this.check('OPERATOR') && (this.peek().lexeme === 'div' || this.peek().lexeme === 'mod')) {\r\n const operator = this.advance().lexeme as ArithmeticOperator;\r\n const right = this.parseUnaryExpr();\r\n left = new XPathArithmeticExpression(left, right, operator);\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return left;\r\n }\r\n\r\n private parseUnaryExpr(): XPathExpression {\r\n if (this.match('MINUS')) {\r\n const operand = this.parseUnaryExpr();\r\n return new XPathUnaryExpression('-', operand);\r\n }\r\n\r\n return this.parseUnionExpr();\r\n }\r\n\r\n private parseUnionExpr(): XPathExpression {\r\n let left = this.parsePathExpr();\r\n\r\n while (this.match('PIPE')) {\r\n const right = this.parsePathExpr();\r\n left = new XPathUnionExpression(left, right);\r\n }\r\n\r\n return left;\r\n }\r\n\r\n // ==================== Path Expression Parsing ====================\r\n\r\n private parsePathExpr(): XPathExpression {\r\n // Check if this starts a location path\r\n if (this.check('SLASH') || this.check('DOUBLE_SLASH')) {\r\n return this.parseLocationPath();\r\n }\r\n\r\n // Check for axis or abbreviated step that starts a relative location path\r\n if (this.isStepStart()) {\r\n return this.parseLocationPath();\r\n }\r\n\r\n // Otherwise it's a filter expression (possibly followed by path)\r\n const filterExpr = this.parseFilterExpr();\r\n\r\n // Check if followed by '/' or '//'\r\n if (this.match('SLASH', 'DOUBLE_SLASH')) {\r\n const isDescendant = this.previous().type === 'DOUBLE_SLASH';\r\n const steps = this.parseRelativeLocationPath();\r\n\r\n if (isDescendant) {\r\n // Insert descendant-or-self::node() step\r\n steps.unshift(new XPathStep('descendant-or-self', { type: 'node-type', nodeType: 'node' }));\r\n }\r\n\r\n // Combine filter expression with location path\r\n // The filter expression becomes the context for the path\r\n return new XPathFilterExpression(filterExpr, new XPathLocationPath(steps, false));\r\n }\r\n\r\n return filterExpr;\r\n }\r\n\r\n private isStepStart(): boolean {\r\n if (this.isAtEnd()) return false;\r\n\r\n const token = this.peek();\r\n\r\n // Abbreviated steps\r\n if (token.type === 'DOT' || token.type === 'DOT_DOT') return true;\r\n\r\n // Attribute axis abbreviation\r\n if (token.type === 'AT') return true;\r\n\r\n // Axis name followed by ::\r\n if (token.type === 'LOCATION') return true;\r\n\r\n // Node type test\r\n if (token.type === 'NODE_TYPE') return true;\r\n\r\n // Wildcard\r\n if (token.type === 'ASTERISK') return true;\r\n\r\n // Name test (identifier that's not a function call)\r\n // OPERATOR tokens (div, mod, and, or) can also be element names\r\n // FUNCTION tokens (id, count, etc.) can also be element/attribute names\r\n if (token.type === 'IDENTIFIER' || token.type === 'OPERATOR' || token.type === 'FUNCTION') {\r\n const next = this.peekNext();\r\n // It's a step if not followed by '(' (which would make it a function call)\r\n return !next || next.type !== 'OPEN_PAREN';\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private parseLocationPath(): XPathExpression {\r\n let absolute = false;\r\n const steps: XPathStep[] = [];\r\n\r\n if (this.match('SLASH')) {\r\n absolute = true;\r\n\r\n // Check if there's a relative path following\r\n if (!this.isAtEnd() && this.isStepStart()) {\r\n steps.push(...this.parseRelativeLocationPath());\r\n }\r\n } else if (this.match('DOUBLE_SLASH')) {\r\n absolute = true;\r\n\r\n // '//' is shorthand for '/descendant-or-self::node()/'\r\n steps.push(new XPathStep('descendant-or-self', { type: 'node-type', nodeType: 'node' }));\r\n steps.push(...this.parseRelativeLocationPath());\r\n } else {\r\n // Relative location path\r\n steps.push(...this.parseRelativeLocationPath());\r\n }\r\n\r\n return new XPathLocationPath(steps, absolute);\r\n }\r\n\r\n private parseRelativeLocationPath(): XPathStep[] {\r\n const steps: XPathStep[] = [];\r\n\r\n steps.push(this.parseStep());\r\n\r\n while (this.match('SLASH', 'DOUBLE_SLASH')) {\r\n const isDescendant = this.previous().type === 'DOUBLE_SLASH';\r\n\r\n if (isDescendant) {\r\n // '//' is shorthand for '/descendant-or-self::node()/'\r\n steps.push(new XPathStep('descendant-or-self', { type: 'node-type', nodeType: 'node' }));\r\n }\r\n\r\n steps.push(this.parseStep());\r\n }\r\n\r\n return steps;\r\n }\r\n\r\n private parseStep(): XPathStep {\r\n // Handle abbreviated steps\r\n if (this.match('DOT')) {\r\n return new XPathStep('self', { type: 'node-type', nodeType: 'node' });\r\n }\r\n\r\n if (this.match('DOT_DOT')) {\r\n return new XPathStep('parent', { type: 'node-type', nodeType: 'node' });\r\n }\r\n\r\n // Parse axis\r\n let axis: AxisType = 'child'; // default axis\r\n\r\n if (this.match('AT')) {\r\n axis = 'attribute';\r\n } else if (this.check('LOCATION')) {\r\n // Only treat as axis if followed by ::\r\n const next = this.peekNext();\r\n if (next && next.type === 'COLON_COLON') {\r\n axis = this.advance().lexeme as AxisType;\r\n this.advance(); // consume ::\r\n }\r\n // Otherwise, it's an element name that happens to match an axis name\r\n }\r\n\r\n // Parse node test\r\n const nodeTest = this.parseNodeTest();\r\n\r\n // Parse predicates\r\n const predicates = this.parsePredicates();\r\n\r\n return new XPathStep(axis, nodeTest, predicates);\r\n }\r\n\r\n private parseNodeTest(): NodeTest {\r\n // Wildcard\r\n if (this.match('ASTERISK')) {\r\n return { type: 'wildcard' };\r\n }\r\n\r\n // Node type test: node(), text(), comment(), processing-instruction()\r\n // Only if followed by '(' - otherwise it's a name test\r\n if (this.check('NODE_TYPE')) {\r\n const next = this.peekNext();\r\n if (next && next.type === 'OPEN_PAREN') {\r\n const nodeType = this.advance().lexeme as 'node' | 'text' | 'comment' | 'processing-instruction';\r\n this.advance(); // consume '('\r\n\r\n // processing-instruction can have an optional literal argument\r\n if (nodeType === 'processing-instruction' && this.check('STRING')) {\r\n const name = this.advance().lexeme;\r\n this.consume('CLOSE_PAREN', \"Expected ')' after processing-instruction name\");\r\n return { type: 'processing-instruction', name };\r\n }\r\n\r\n this.consume('CLOSE_PAREN', \"Expected ')' after node type\");\r\n return { type: 'node-type', nodeType };\r\n }\r\n // Fall through to name test if not followed by '('\r\n }\r\n\r\n // Name test - can be IDENTIFIER, LOCATION (axis names), FUNCTION (function names), NODE_TYPE,\r\n // or OPERATOR (div, mod, and, or can be element names too)\r\n // All of these can be used as element names in XPath\r\n if (this.check('IDENTIFIER') || this.check('LOCATION') || this.check('FUNCTION') ||\r\n this.check('NODE_TYPE') || this.check('OPERATOR')) {\r\n const name = this.advance().lexeme;\r\n\r\n // Check for namespace prefix\r\n if (this.match('COLON')) {\r\n if (this.match('ASTERISK')) {\r\n // prefix:* - match any element in namespace\r\n return { type: 'wildcard', name: `${name}:*` };\r\n }\r\n // Local name can also be any of these token types\r\n if (this.check('IDENTIFIER') || this.check('LOCATION') || this.check('FUNCTION') ||\r\n this.check('NODE_TYPE') || this.check('OPERATOR')) {\r\n const localName = this.advance().lexeme;\r\n return { type: 'name', name: `${name}:${localName}` };\r\n }\r\n throw new Error('Expected local name after namespace prefix');\r\n }\r\n\r\n return { type: 'name', name };\r\n }\r\n\r\n throw new Error(`Expected node test, got: ${this.peek()?.lexeme ?? 'EOF'}`);\r\n }\r\n\r\n private parsePredicates(): XPathExpression[] {\r\n const predicates: XPathExpression[] = [];\r\n\r\n while (this.match('OPEN_SQUARE_BRACKET')) {\r\n const expr = this.parseExpr();\r\n this.consume('CLOSE_SQUARE_BRACKET', \"Expected ']' after predicate\");\r\n predicates.push(new XPathPredicate(expr));\r\n }\r\n\r\n return predicates;\r\n }\r\n\r\n // ==================== Filter Expression Parsing ====================\r\n\r\n private parseFilterExpr(): XPathExpression {\r\n let expr = this.parsePrimaryExpr();\r\n\r\n // Apply predicates\r\n while (this.check('OPEN_SQUARE_BRACKET')) {\r\n const predicates = this.parsePredicates();\r\n for (const predicate of predicates) {\r\n expr = new XPathFilterExpression(expr, predicate);\r\n }\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n private parsePrimaryExpr(): XPathExpression {\r\n // Variable reference: $name\r\n if (this.match('DOLLAR')) {\r\n const name = this.consume('IDENTIFIER', 'Expected variable name after $').lexeme;\r\n return new XPathVariableReference(name);\r\n }\r\n\r\n // Parenthesized expression\r\n if (this.match('OPEN_PAREN')) {\r\n const expr = this.parseExpr();\r\n this.consume('CLOSE_PAREN', \"Expected ')' after expression\");\r\n return expr;\r\n }\r\n\r\n // String literal\r\n if (this.check('STRING')) {\r\n const value = this.advance().lexeme;\r\n return new XPathStringLiteral(value);\r\n }\r\n\r\n // Number literal\r\n if (this.check('NUMBER')) {\r\n const value = parseFloat(this.advance().lexeme);\r\n return new XPathNumberLiteral(value);\r\n }\r\n\r\n // Function call\r\n if (this.check('FUNCTION') || this.check('IDENTIFIER')) {\r\n const next = this.peekNext();\r\n if (next && next.type === 'OPEN_PAREN') {\r\n return this.parseFunctionCall();\r\n }\r\n }\r\n\r\n throw new Error(`Unexpected token in primary expression: ${this.peek()?.lexeme ?? 'EOF'}`);\r\n }\r\n\r\n private parseFunctionCall(): XPathExpression {\r\n const name = this.advance().lexeme;\r\n this.consume('OPEN_PAREN', \"Expected '(' after function name\");\r\n\r\n const args: XPathExpression[] = [];\r\n\r\n if (!this.check('CLOSE_PAREN')) {\r\n do {\r\n args.push(this.parseExpr());\r\n } while (this.match('COMMA'));\r\n }\r\n\r\n this.consume('CLOSE_PAREN', \"Expected ')' after function arguments\");\r\n\r\n return new XPathFunctionCall(name, args);\r\n }\r\n}\r\n","import { XPathNode } from \"./node\";\r\n\r\n/**\r\n * Node type constants (matching DOM specification)\r\n */\r\nexport const NodeType = {\r\n ELEMENT_NODE: 1,\r\n ATTRIBUTE_NODE: 2,\r\n TEXT_NODE: 3,\r\n CDATA_SECTION_NODE: 4,\r\n PROCESSING_INSTRUCTION_NODE: 7,\r\n COMMENT_NODE: 8,\r\n DOCUMENT_NODE: 9,\r\n DOCUMENT_FRAGMENT_NODE: 11,\r\n} as const;\r\n\r\n/**\r\n * Type for custom XPath functions that can be registered in the context.\r\n */\r\nexport type XPathFunction = (...args: any[]) => any;\r\n\r\n/**\r\n * Type for the variables map in the context.\r\n */\r\nexport type XPathVariables = Record<string, any>;\r\n\r\n/**\r\n * Type for the custom functions map in the context.\r\n */\r\nexport type XPathFunctions = Record<string, XPathFunction>;\r\n\r\n/**\r\n * Type for namespace bindings (prefix -> namespace URI).\r\n */\r\nexport type XPathNamespaces = Record<string, string>;\r\n\r\n/**\r\n * The evaluation context for XPath expressions.\r\n *\r\n * This context is passed to all expression evaluate() methods and contains:\r\n * - The current context node\r\n * - Position information for predicates\r\n * - Variable bindings\r\n * - Custom function definitions\r\n */\r\nexport interface XPathContext {\r\n /**\r\n * The current context node being evaluated.\r\n */\r\n node?: XPathNode;\r\n\r\n /**\r\n * The position of the context node within the current node set (1-based).\r\n * Used by position() function and numeric predicates.\r\n */\r\n position?: number;\r\n\r\n /**\r\n * The size of the current node set.\r\n * Used by last() function.\r\n */\r\n size?: number;\r\n\r\n /**\r\n * The full node list for the current context.\r\n * Used by the 'self-and-siblings' axis (XSLT-specific).\r\n */\r\n nodeList?: XPathNode[];\r\n\r\n /**\r\n * Variable bindings available during evaluation.\r\n * Variables are referenced in XPath as $variableName.\r\n */\r\n variables?: XPathVariables;\r\n\r\n /**\r\n * Custom functions available during evaluation.\r\n * These extend the built-in XPath 1.0 function library.\r\n */\r\n functions?: XPathFunctions;\r\n\r\n /**\r\n * Namespace bindings for resolving prefixes in XPath expressions.\r\n * Maps namespace prefixes to namespace URIs.\r\n * Example: { \"atom\": \"http://www.w3.org/2005/Atom\" }\r\n */\r\n namespaces?: XPathNamespaces;\r\n}\r\n\r\n/**\r\n * Result types that can be returned from XPath evaluation.\r\n */\r\nexport type XPathResult =\r\n | XPathNode[] // Node set\r\n | string // String\r\n | number // Number\r\n | boolean; // Boolean\r\n\r\n/**\r\n * Creates a new XPath context with the given node as the context node.\r\n */\r\nexport function createContext(node: XPathNode, options?: Partial<XPathContext>): XPathContext {\r\n return {\r\n node,\r\n position: 1,\r\n size: 1,\r\n ...options,\r\n };\r\n}\r\n\r\n/**\r\n * Creates a child context for predicate evaluation.\r\n * Preserves variables and functions from parent context.\r\n */\r\nexport function createPredicateContext(\r\n parent: XPathContext,\r\n node: XPathNode,\r\n position: number,\r\n size: number\r\n): XPathContext {\r\n return {\r\n ...parent,\r\n node,\r\n position,\r\n size,\r\n };\r\n}\r\n","import { XNode } from \"../../dom\";\r\nimport { NodeValue } from \"./node-value\";\r\n\r\nexport class StringValue implements NodeValue {\r\n value: any;\r\n type: string;\r\n\r\n constructor(value: any) {\r\n this.value = value;\r\n this.type = 'string';\r\n }\r\n\r\n stringValue(): string {\r\n return String(this.value);\r\n }\r\n\r\n booleanValue() {\r\n return this.value.length > 0;\r\n }\r\n\r\n numberValue() {\r\n return this.value - 0;\r\n }\r\n\r\n nodeSetValue(): XNode[] {\r\n throw this;\r\n }\r\n}\r\n","import { XNode } from \"../../dom\";\r\nimport { NodeValue } from \"./node-value\";\r\n\r\nexport class NumberValue implements NodeValue {\r\n value: any;\r\n type: string;\r\n\r\n constructor(value: any) {\r\n this.value = value;\r\n this.type = 'number';\r\n }\r\n\r\n stringValue(): string {\r\n return `${this.value}`;\r\n }\r\n\r\n booleanValue() {\r\n return !!this.value;\r\n }\r\n\r\n numberValue() {\r\n return this.value - 0;\r\n }\r\n\r\n nodeSetValue(): XNode[] {\r\n throw this;\r\n }\r\n}\r\n","import { XNode } from \"../../dom\";\r\nimport { NodeValue } from \"./node-value\";\r\n\r\nexport class BooleanValue implements NodeValue {\r\n value: any;\r\n type: string;\r\n\r\n constructor(value: any) {\r\n this.value = value;\r\n this.type = 'boolean';\r\n }\r\n\r\n stringValue(): string {\r\n return `${this.value}`;\r\n }\r\n\r\n booleanValue() {\r\n return this.value;\r\n }\r\n\r\n numberValue() {\r\n return this.value ? 1 : 0;\r\n }\r\n\r\n nodeSetValue(): XNode[] {\r\n throw this;\r\n }\r\n}\r\n","// Copyright 2023-2024 Design Liquido\r\n// Copyright 2018 Johannes Wilm\r\n// Copyright 2005 Google Inc.\r\n// All Rights Reserved\r\n\r\nimport { XDocument } from \"./xdocument\";\r\nimport { XNode } from './xnode';\r\n\r\n// Wrapper around DOM methods so we can condense their invocations.\r\nexport function domGetAttributeValue(node: XNode, name: string) {\r\n return node.getAttributeValue(name);\r\n}\r\n\r\nexport function domSetAttribute(node: XNode, name: string, value: any) {\r\n return node.setAttribute(name, value);\r\n}\r\n\r\nexport function domAppendChild(node: XNode, child: any) {\r\n return node.appendChild(child);\r\n}\r\n\r\nexport function domCreateTextNode(node: XDocument, text: string) {\r\n return node.createTextNode(text);\r\n}\r\n\r\nexport function domCreateElement(doc: XDocument, name: string) {\r\n return doc.createElement(name);\r\n}\r\n\r\nexport function domCreateCDATASection(doc: XDocument, data: any) {\r\n return doc.createCDATASection(data);\r\n}\r\n\r\nexport function domCreateComment(doc: any, text: any) {\r\n return doc.createComment(text);\r\n}\r\n\r\nexport function domCreateDocumentFragment(doc: XDocument): XNode {\r\n return doc.createDocumentFragment();\r\n}\r\n\r\nexport function domCreateDTDSection(doc: XDocument, data: any) {\r\n return doc.createDTDSection(data);\r\n}\r\n\r\n//XDocument.prototype = new XNode(DOM_DOCUMENT_NODE, '#document');\r\n","// Based on <http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247>\r\nexport const DOM_ELEMENT_NODE = 1;\r\nexport const DOM_ATTRIBUTE_NODE = 2;\r\nexport const DOM_TEXT_NODE = 3;\r\nexport const DOM_CDATA_SECTION_NODE = 4;\r\nexport const DOM_ENTITY_REFERENCE_NODE = 5;\r\nexport const DOM_ENTITY_NODE = 6;\r\nexport const DOM_PROCESSING_INSTRUCTION_NODE = 7;\r\nexport const DOM_COMMENT_NODE = 8;\r\nexport const DOM_DOCUMENT_NODE = 9;\r\nexport const DOM_DOCUMENT_TYPE_NODE = 10;\r\nexport const DOM_DOCUMENT_FRAGMENT_NODE = 11;\r\nexport const DOM_NOTATION_NODE = 12;\r\n","import { DOM_ATTRIBUTE_NODE, DOM_ELEMENT_NODE } from '../constants';\r\n\r\n// operate on native DOM nodes.\r\n/**\r\n * Our W3C DOM Node implementation. Note we call it XNode because we\r\n * can't define the identifier Node. We do this mostly for Opera,\r\n * where we can't reuse the HTML DOM for parsing our own XML, and for\r\n * Safari, where it is too expensive to have the template processor.\r\n */\r\nexport class XNode {\r\n id: number;\r\n childNodes: XNode[];\r\n nodeType: number;\r\n nodeName: string;\r\n nodeValue: any;\r\n firstChild: XNode;\r\n lastChild: XNode;\r\n nextSibling: XNode;\r\n previousSibling: XNode;\r\n siblingPosition: number;\r\n\r\n ownerDocument: any;\r\n namespaceUri: any;\r\n prefix: string;\r\n localName: string;\r\n\r\n parentNode: XNode;\r\n\r\n visited: boolean;\r\n escape: boolean;\r\n\r\n static _unusedXNodes: any[] = [];\r\n\r\n constructor(type: number, name: string, opt_value: any, opt_owner: any, opt_namespace?: any) {\r\n this.id = Math.random() * (Number.MAX_SAFE_INTEGER - 1) + 1;\r\n this.childNodes = [];\r\n this.visited = false;\r\n this.escape = true;\r\n this.siblingPosition = -1;\r\n\r\n this.init(type, name, opt_value, opt_owner, opt_namespace);\r\n }\r\n\r\n /**\r\n * Node initialization. Called by the constructor and `recycle` method.\r\n * @param type The node type.\r\n * @param name The node name.\r\n * @param value The node value.\r\n * @param owner The node owner.\r\n * @param namespaceUri The node namespace.\r\n */\r\n init(type: number, name: string, value: string, owner: any, namespaceUri: any) {\r\n this.nodeType = type - 0;\r\n this.nodeName = `${name}`;\r\n this.nodeValue = `${value}`;\r\n this.ownerDocument = owner;\r\n this.namespaceUri = namespaceUri || null;\r\n [this.prefix, this.localName] = this.qualifiedNameToParts(`${name}`);\r\n\r\n this.firstChild = null;\r\n this.lastChild = null;\r\n this.nextSibling = null;\r\n this.previousSibling = null;\r\n this.parentNode = null;\r\n }\r\n\r\n protected qualifiedNameToParts(name: string) {\r\n if (name.includes(':')) {\r\n return name.split(':');\r\n }\r\n\r\n return [null, name];\r\n }\r\n\r\n // Traverses the element nodes in the DOM section underneath the given\r\n // node and invokes the given callbacks as methods on every element\r\n // node encountered. Function opt_pre is invoked before a node's\r\n // children are traversed; opt_post is invoked after they are\r\n // traversed. Traversal will not be continued if a callback function\r\n // returns boolean false. NOTE(mesch): copied from\r\n // <//google3/maps/webmaps/javascript/dom.js>.\r\n protected domTraverseElements(node: XNode, opt_pre: Function, opt_post: any) {\r\n let ret;\r\n if (opt_pre) {\r\n ret = opt_pre.call(null, node);\r\n if (typeof ret == 'boolean' && !ret) {\r\n return false;\r\n }\r\n }\r\n\r\n for (let c = node.firstChild; c; c = c.nextSibling) {\r\n if (c.nodeType == DOM_ELEMENT_NODE) {\r\n ret = this.domTraverseElements.call(this, c, opt_pre, opt_post);\r\n if (typeof ret == 'boolean' && !ret) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n if (opt_post) {\r\n ret = opt_post.call(null, node);\r\n if (typeof ret == 'boolean' && !ret) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n // TODO: Do we still need this?\r\n static recycle(node: any) {\r\n if (!node) {\r\n return;\r\n }\r\n\r\n if (node.constructor.name === 'XDocument') {\r\n this.recycle((node as any).documentElement);\r\n return;\r\n }\r\n\r\n if (node.constructor != this) {\r\n return;\r\n }\r\n\r\n this._unusedXNodes.push(node);\r\n /* for (let a = 0; a < node.attributes.length; ++a) {\r\n this.recycle(node.attributes[a]);\r\n } */\r\n\r\n for (let c = 0; c < node.childNodes.length; ++c) {\r\n this.recycle(node.childNodes[c]);\r\n }\r\n\r\n // node.attributes.length = 0;\r\n node.childNodes.length = 0;\r\n node.init.call(0, '', '', null);\r\n }\r\n\r\n static create(type: any, name: string, value: any, owner: any, namespace?: any): XNode {\r\n if (this._unusedXNodes.length > 0) {\r\n const node = this._unusedXNodes.pop();\r\n node.init(type, name, value, owner, namespace);\r\n return node;\r\n }\r\n\r\n return new XNode(type, name, value, owner, namespace);\r\n }\r\n\r\n static clone(node: XNode, newOwner: XNode): XNode {\r\n const newNode = new XNode(node.nodeType, node.nodeName, node.nodeValue, newOwner, node.namespaceUri);\r\n newNode.id = node.id;\r\n for (let child of node.childNodes) {\r\n newNode.appendChild(XNode.clone(child, newNode));\r\n }\r\n\r\n /* for (let attribute of node.attributes) {\r\n newNode.setAttribute(attribute.nodeName, attribute.nodeValue);\r\n } */\r\n\r\n return newNode;\r\n }\r\n\r\n appendChild(node: XNode) {\r\n // firstChild\r\n if (this.childNodes.length === 0) {\r\n this.firstChild = node;\r\n }\r\n\r\n // previousSibling\r\n node.previousSibling = this.lastChild;\r\n\r\n // nextSibling\r\n node.nextSibling = null;\r\n if (this.lastChild) {\r\n this.lastChild.nextSibling = node;\r\n }\r\n\r\n // parentNode\r\n node.parentNode = this;\r\n\r\n // lastChild\r\n this.lastChild = node;\r\n\r\n // childNodes\r\n this.childNodes.push(node);\r\n }\r\n\r\n replaceChild(newNode: any, oldNode: any) {\r\n if (oldNode == newNode) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this.childNodes.length; ++i) {\r\n if (this.childNodes[i] == oldNode) {\r\n this.childNodes[i] = newNode;\r\n\r\n let p = oldNode.parentNode;\r\n oldNode.parentNode = null;\r\n newNode.parentNode = p;\r\n\r\n p = oldNode.previousSibling;\r\n oldNode.previousSibling = null;\r\n newNode.previousSibling = p;\r\n if (newNode.previousSibling) {\r\n newNode.previousSibling.nextSibling = newNode;\r\n }\r\n\r\n p = oldNode.nextSibling;\r\n oldNode.nextSibling = null;\r\n newNode.nextSibling = p;\r\n if (newNode.nextSibling) {\r\n newNode.nextSibling.previousSibling = newNode;\r\n }\r\n\r\n if (this.firstChild == oldNode) {\r\n this.firstChild = newNode;\r\n }\r\n\r\n if (this.lastChild == oldNode) {\r\n this.lastChild = newNode;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n insertBefore(newNode: any, oldNode: any) {\r\n if (oldNode == newNode) {\r\n return;\r\n }\r\n\r\n if (oldNode.parentNode != this) {\r\n return;\r\n }\r\n\r\n if (newNode.parentNode) {\r\n newNode.parentNode.removeChild(newNode);\r\n }\r\n\r\n const newChildren = [];\r\n\r\n for (const c of this.childNodes) {\r\n if (c == oldNode) {\r\n newChildren.push(newNode);\r\n\r\n newNode.parentNode = this;\r\n\r\n newNode.previousSibling = oldNode.previousSibling;\r\n oldNode.previousSibling = newNode;\r\n if (newNode.previousSibling) {\r\n newNode.previousSibling.nextSibling = newNode;\r\n }\r\n\r\n newNode.nextSibling = oldNode;\r\n\r\n if (this.firstChild == oldNode) {\r\n this.firstChild = newNode;\r\n }\r\n }\r\n newChildren.push(c);\r\n }\r\n\r\n this.childNodes = newChildren;\r\n }\r\n\r\n removeChild(node: XNode) {\r\n const newChildren = [];\r\n\r\n for (const c of this.childNodes) {\r\n if (c != node) {\r\n newChildren.push(c);\r\n } else {\r\n if (c.previousSibling) {\r\n c.previousSibling.nextSibling = c.nextSibling;\r\n }\r\n if (c.nextSibling) {\r\n c.nextSibling.previousSibling = c.previousSibling;\r\n }\r\n if (this.firstChild == c) {\r\n this.firstChild = c.nextSibling;\r\n }\r\n if (this.lastChild == c) {\r\n this.lastChild = c.previousSibling;\r\n }\r\n }\r\n }\r\n\r\n this.childNodes = newChildren;\r\n }\r\n\r\n hasAttributes() {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n return attributes.length > 0;\r\n }\r\n\r\n setAttribute(name: string, value: any) {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < attributes.length; ++i) {\r\n if (attributes[i].nodeName == name) {\r\n attributes[i].nodeValue = `${value}`;\r\n return;\r\n }\r\n }\r\n\r\n const newAttribute = XNode.create(DOM_ATTRIBUTE_NODE, name, value, this);\r\n newAttribute.parentNode = this;\r\n this.appendChild(newAttribute);\r\n }\r\n\r\n setAttributeNS(namespace: any, name: any, value: any) {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < attributes.length; ++i) {\r\n const attribute = attributes[i];\r\n if (\r\n attribute.namespaceUri == namespace &&\r\n attribute.localName == this.qualifiedNameToParts(`${name}`)[1]\r\n ) {\r\n attribute.nodeValue = `${value}`;\r\n attribute.nodeName = `${name}`;\r\n attribute.prefix = this.qualifiedNameToParts(`${name}`)[0];\r\n return;\r\n }\r\n }\r\n\r\n const newAttribute = XNode.create(DOM_ATTRIBUTE_NODE, name, value, this, namespace);\r\n newAttribute.parentNode = this;\r\n this.appendChild(newAttribute);\r\n }\r\n\r\n getAttributeValue(name: string): any {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < attributes.length; ++i) {\r\n if (attributes[i].nodeName === name) {\r\n return attributes[i].nodeValue;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getAttributeNS(namespace: any, localName: any) {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < attributes.length; ++i) {\r\n const attribute = attributes[i];\r\n if (attribute.namespaceUri === namespace && attribute.localName === localName) {\r\n return attribute.nodeValue;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n hasAttribute(name: string) {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < attributes.length; ++i) {\r\n if (attributes[i].nodeName === name) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n hasAttributeNS(namespace: string, localName: string) {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < attributes.length; ++i) {\r\n const attribute = attributes[i];\r\n if (attribute.namespaceUri === namespace && attribute.localName === localName) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n removeAttribute(name: string) {\r\n const newChildNodes: XNode[] = [];\r\n for (let i = 0; i < this.childNodes.length; ++i) {\r\n const childNode = this.childNodes[i];\r\n if (childNode.nodeType !== DOM_ATTRIBUTE_NODE) {\r\n newChildNodes.push(childNode);\r\n continue;\r\n }\r\n\r\n if (childNode.nodeName !== name) {\r\n newChildNodes.push(childNode);\r\n }\r\n }\r\n\r\n this.childNodes = newChildNodes;\r\n }\r\n\r\n removeAttributeNS(namespace: string, localName: string) {\r\n const newChildNodes: XNode[] = [];\r\n for (let i = 0; i < this.childNodes.length; ++i) {\r\n const childNode = this.childNodes[i];\r\n if (childNode.nodeType !== DOM_ATTRIBUTE_NODE) {\r\n newChildNodes.push(childNode);\r\n continue;\r\n }\r\n\r\n if (childNode.localName !== localName || childNode.namespaceUri !== namespace) {\r\n newChildNodes.push(childNode);\r\n }\r\n }\r\n\r\n this.childNodes = newChildNodes;\r\n }\r\n\r\n getElementsByTagName(name: string) {\r\n const ret = [];\r\n const self = this;\r\n if ('*' == name) {\r\n this.domTraverseElements(\r\n this,\r\n (node: XNode) => {\r\n if (self == node) return;\r\n ret.push(node);\r\n },\r\n null\r\n );\r\n } else {\r\n this.domTraverseElements(\r\n this,\r\n (node: XNode) => {\r\n if (self == node) return;\r\n if (node.nodeName == name) {\r\n ret.push(node);\r\n }\r\n },\r\n null\r\n );\r\n }\r\n return ret;\r\n }\r\n\r\n getElementsByTagNameNS(namespace: string, localName: string) {\r\n const ret = [];\r\n const self = this;\r\n if ('*' == namespace && '*' == localName) {\r\n this.domTraverseElements(\r\n this,\r\n (node: any) => {\r\n if (self == node) return;\r\n ret.push(node);\r\n },\r\n null\r\n );\r\n } else if ('*' == namespace) {\r\n this.domTraverseElements(\r\n this,\r\n (node: any) => {\r\n if (self == node) return;\r\n if (node.localName == localName) ret.push(node);\r\n },\r\n null\r\n );\r\n } else if ('*' == localName) {\r\n this.domTraverseElements(\r\n this,\r\n (node: any) => {\r\n if (self == node) return;\r\n if (node.namespaceUri == namespace) ret.push(node);\r\n },\r\n null\r\n );\r\n } else {\r\n this.domTraverseElements(\r\n this,\r\n (node: any) => {\r\n if (self == node) return;\r\n if (node.localName == localName && node.namespaceUri == namespace) {\r\n ret.push(node);\r\n }\r\n },\r\n null\r\n );\r\n }\r\n return ret;\r\n }\r\n\r\n getElementById(id: any): any {\r\n let ret = null;\r\n this.domTraverseElements(\r\n this,\r\n (node: any) => {\r\n if (node.getAttributeValue('id') == id) {\r\n ret = node;\r\n return false;\r\n }\r\n },\r\n null\r\n );\r\n return ret;\r\n }\r\n\r\n getAncestorByLocalName(localName: string): XNode | undefined {\r\n if (this.parentNode === null || this.parentNode === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (this.parentNode.localName === localName) {\r\n return this.parentNode;\r\n }\r\n\r\n return this.parentNode.getAncestorByLocalName(localName);\r\n }\r\n\r\n getAncestorById(id: number): XNode | undefined {\r\n if (this.parentNode === null || this.parentNode === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (this.parentNode.id === id) {\r\n return this.parentNode;\r\n }\r\n\r\n return this.parentNode.getAncestorById(id);\r\n }\r\n\r\n toString(): string {\r\n return `${this.nodeType}, ${this.nodeName}, ${this.nodeValue}`;\r\n }\r\n}\r\n","import {\r\n DOM_ATTRIBUTE_NODE,\r\n DOM_CDATA_SECTION_NODE,\r\n DOM_COMMENT_NODE,\r\n DOM_DOCUMENT_FRAGMENT_NODE,\r\n DOM_DOCUMENT_NODE,\r\n DOM_DOCUMENT_TYPE_NODE,\r\n DOM_ELEMENT_NODE,\r\n DOM_TEXT_NODE\r\n} from '../constants';\r\nimport { XNode } from './xnode';\r\n\r\nexport class XDocument extends XNode {\r\n documentElement: any;\r\n\r\n constructor() {\r\n // NOTE(mesch): According to the DOM Spec, ownerDocument of a\r\n // document node is null.\r\n super(DOM_DOCUMENT_NODE, '#document', null, null);\r\n this.documentElement = null;\r\n }\r\n\r\n // TODO: Do we still need this?\r\n /* clear() {\r\n XNode.recycle(this.documentElement);\r\n this.documentElement = null;\r\n } */\r\n\r\n appendChild(node: any) {\r\n super.appendChild(node);\r\n this.documentElement = this.childNodes[0];\r\n }\r\n\r\n createElement(name: string): XNode {\r\n return XNode.create(DOM_ELEMENT_NODE, name, null, this);\r\n }\r\n\r\n createElementNS(namespace: any, name: any) {\r\n return XNode.create(DOM_ELEMENT_NODE, name, null, this, namespace);\r\n }\r\n\r\n createDocumentFragment(): XNode {\r\n return XNode.create(DOM_DOCUMENT_FRAGMENT_NODE, '#document-fragment', null, this);\r\n }\r\n\r\n createTextNode(value: any) {\r\n return XNode.create(DOM_TEXT_NODE, '#text', value, this);\r\n }\r\n\r\n createAttribute(name: any) {\r\n return XNode.create(DOM_ATTRIBUTE_NODE, name, null, this);\r\n }\r\n\r\n createAttributeNS(namespace: any, name: any) {\r\n return XNode.create(DOM_ATTRIBUTE_NODE, name, null, this, namespace);\r\n }\r\n\r\n createComment(data: any) {\r\n return XNode.create(DOM_COMMENT_NODE, '#comment', data, this);\r\n }\r\n\r\n createCDATASection(data: any) {\r\n return XNode.create(DOM_CDATA_SECTION_NODE, '#cdata-section', data, this);\r\n }\r\n\r\n createDTDSection(data: any) {\r\n return XNode.create(DOM_DOCUMENT_TYPE_NODE, '#dtd-section', data, this);\r\n }\r\n}\r\n","import he from 'he';\r\n\r\nimport {\r\n DOM_ATTRIBUTE_NODE,\r\n DOM_CDATA_SECTION_NODE,\r\n DOM_COMMENT_NODE,\r\n DOM_DOCUMENT_FRAGMENT_NODE,\r\n DOM_DOCUMENT_NODE,\r\n DOM_DOCUMENT_TYPE_NODE,\r\n DOM_ELEMENT_NODE,\r\n DOM_TEXT_NODE\r\n} from '../constants';\r\nimport { domGetAttributeValue } from './functions';\r\nimport { XNode } from './xnode';\r\nimport { XDocument } from './xdocument';\r\nimport { XmlOutputOptions } from './xml-output-options';\r\nimport { XBrowserNode } from './xbrowser-node';\r\n\r\n/**\r\n * Returns the text value of a node; for nodes without children this\r\n * is the nodeValue, for nodes with children this is the concatenation\r\n * of the value of all children. Browser-specific optimizations are used by\r\n * default; they can be disabled by passing \"true\" in as the second parameter.\r\n * @param node The Node (not exactly a `XNode` here).\r\n * @param disallowBrowserSpecificOptimization A boolean, to avoid browser optimization.\r\n * @returns The XML value as a string.\r\n */\r\nexport function xmlValue(node: XNode, disallowBrowserSpecificOptimization: boolean = false): string {\r\n if (!node) {\r\n return '';\r\n }\r\n\r\n let ret = '';\r\n switch (node.nodeType) {\r\n case DOM_DOCUMENT_TYPE_NODE:\r\n return `<!DOCTYPE ${node.nodeValue}>`;\r\n case DOM_TEXT_NODE:\r\n case DOM_CDATA_SECTION_NODE:\r\n case DOM_ATTRIBUTE_NODE:\r\n return node.nodeValue;\r\n case DOM_ELEMENT_NODE:\r\n case DOM_DOCUMENT_NODE:\r\n case DOM_DOCUMENT_FRAGMENT_NODE:\r\n if (!disallowBrowserSpecificOptimization) {\r\n // Only returns something if node has either `innerText` or `textContent` (not an XNode).\r\n // IE, Safari, Opera, and friends (`innerText`)\r\n const browserNode = node as XBrowserNode;\r\n const innerText = browserNode.innerText;\r\n if (innerText !== undefined) {\r\n return innerText;\r\n }\r\n // Firefox (`textContent`)\r\n const textContent = browserNode.textContent;\r\n if (textContent !== undefined) {\r\n return textContent;\r\n }\r\n }\r\n\r\n const textNodes = node.childNodes.filter((n: XNode) => n.nodeType !== DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < textNodes.length; ++i) {\r\n ret += xmlValue(textNodes[i]);\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n\r\n/**\r\n * The older version to obtain a XML value from a node.\r\n * For now, this form is only used to get text from attribute nodes, \r\n * and it should be removed in future versions.\r\n * @param node The attribute node.\r\n * @param disallowBrowserSpecificOptimization A boolean, to avoid browser optimization.\r\n * @returns The XML value as a string.\r\n */\r\nexport function xmlValueLegacyBehavior(node: XNode, disallowBrowserSpecificOptimization: boolean = false) {\r\n if (!node) {\r\n return '';\r\n }\r\n\r\n let returnedXmlString = '';\r\n switch (node.nodeType) {\r\n case DOM_ATTRIBUTE_NODE:\r\n case DOM_TEXT_NODE:\r\n returnedXmlString += node.nodeValue;\r\n break;\r\n case DOM_CDATA_SECTION_NODE:\r\n returnedXmlString += node.nodeValue;\r\n break;\r\n case DOM_DOCUMENT_NODE:\r\n case DOM_DOCUMENT_FRAGMENT_NODE:\r\n case DOM_ELEMENT_NODE:\r\n if (!disallowBrowserSpecificOptimization) {\r\n // IE, Safari, Opera, and friends\r\n const browserNode = node as XBrowserNode;\r\n const innerText = browserNode.innerText;\r\n if (innerText !== undefined) {\r\n return innerText;\r\n }\r\n // Firefox\r\n const textContent = browserNode.textContent;\r\n if (textContent !== undefined) {\r\n return textContent;\r\n }\r\n }\r\n\r\n const len = node.childNodes.length;\r\n for (let i = 0; i < len; ++i) {\r\n returnedXmlString += xmlValue(node.childNodes[i]);\r\n }\r\n\r\n break;\r\n }\r\n\r\n return returnedXmlString;\r\n}\r\n\r\n/**\r\n * Returns the representation of a node as XML text.\r\n * In general it is not used by XSLT, that uses `xmlTransformedText` instead.\r\n * @param {XNode} node The starting node.\r\n * @param {XmlOutputOptions} options XML output options.\r\n * @returns The XML string.\r\n * @see xmlTransformedText\r\n */\r\nexport function xmlText(\r\n node: XNode,\r\n options: XmlOutputOptions = {\r\n cData: true,\r\n escape: true,\r\n selfClosingTags: true,\r\n outputMethod: 'xml'\r\n }\r\n) {\r\n const buffer: string[] = [];\r\n xmlTextRecursive(node, buffer, options);\r\n return buffer.join('');\r\n}\r\n\r\n/**\r\n * The recursive logic to transform a node in XML text.\r\n * It can be considered legacy, since it does not work with transformed nodes, and\r\n * probably will be removed in the future.\r\n * @param {XNode} node The node.\r\n * @param {string[]} buffer The buffer, that will represent the transformed XML text.\r\n * @param {XmlOutputOptions} options XML output options.\r\n */\r\nfunction xmlTextRecursive(node: XNode, buffer: string[], options: XmlOutputOptions) {\r\n if (node.nodeType == DOM_TEXT_NODE) {\r\n buffer.push(xmlEscapeText(node.nodeValue));\r\n } else if (node.nodeType == DOM_CDATA_SECTION_NODE) {\r\n if (options.cData) {\r\n buffer.push(node.nodeValue);\r\n } else {\r\n buffer.push(`<![CDATA[${node.nodeValue}]]>`);\r\n }\r\n } else if (node.nodeType == DOM_COMMENT_NODE) {\r\n buffer.push(`<!--${node.nodeValue}-->`);\r\n } else if (node.nodeType == DOM_ELEMENT_NODE) {\r\n buffer.push(`<${xmlFullNodeName(node)}`);\r\n\r\n for (let i = 0; i < node.childNodes.length; ++i) {\r\n const childNode = node.childNodes[i];\r\n if (!childNode || childNode.nodeType !== DOM_ATTRIBUTE_NODE) {\r\n continue;\r\n }\r\n\r\n if (childNode.nodeName && childNode.nodeValue) {\r\n buffer.push(` ${xmlFullNodeName(childNode)}=\"${xmlEscapeAttr(childNode.nodeValue)}\"`);\r\n }\r\n }\r\n\r\n if (node.childNodes.length === 0) {\r\n if (\r\n options.selfClosingTags ||\r\n (options.outputMethod === 'html' && ['hr', 'link'].includes(node.nodeName))\r\n ) {\r\n buffer.push('/>');\r\n } else {\r\n buffer.push(`></${xmlFullNodeName(node)}>`);\r\n }\r\n } else {\r\n buffer.push('>');\r\n for (let i = 0; i < node.childNodes.length; ++i) {\r\n xmlTextRecursive(node.childNodes[i], buffer, options);\r\n }\r\n buffer.push(`</${xmlFullNodeName(node)}>`);\r\n }\r\n } else if (node.nodeType == DOM_DOCUMENT_NODE || node.nodeType == DOM_DOCUMENT_FRAGMENT_NODE) {\r\n for (let i = 0; i < node.childNodes.length; ++i) {\r\n xmlTextRecursive(node.childNodes[i], buffer, options);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Returns the representation of a node as XML text.\r\n * @param {XNode} node The starting node.\r\n * @param {XmlOutputOptions} options XML output options.\r\n * @returns The XML string.\r\n */\r\nexport function xmlTransformedText(\r\n node: XNode,\r\n options: XmlOutputOptions = {\r\n cData: true,\r\n escape: true,\r\n selfClosingTags: true,\r\n outputMethod: 'xml'\r\n }\r\n) {\r\n const buffer: string[] = [];\r\n xmlTransformedTextRecursive(node, buffer, options);\r\n return buffer.join('');\r\n}\r\n\r\n/**\r\n * The recursive logic to transform a node in XML text.\r\n * @param {XNode} node The node.\r\n * @param {string[]} buffer The buffer, that will represent the transformed XML text.\r\n * @param {XmlOutputOptions} options XML output options.\r\n */\r\nfunction xmlTransformedTextRecursive(node: XNode, buffer: string[], options: XmlOutputOptions) {\r\n if (node.visited) return;\r\n const nodeType = node.nodeType\r\n const nodeValue = node.nodeValue;\r\n if (nodeType === DOM_TEXT_NODE) {\r\n if (node.nodeValue && node.nodeValue.trim() !== '') {\r\n const finalText =\r\n node.escape && options.escape ? xmlEscapeText(node.nodeValue): xmlUnescapeText(node.nodeValue);\r\n buffer.push(finalText);\r\n }\r\n } else if (nodeType === DOM_CDATA_SECTION_NODE) {\r\n if (options.cData) {\r\n buffer.push(xmlEscapeText(nodeValue));\r\n } else {\r\n buffer.push(`<![CDATA[${nodeValue}]]>`);\r\n }\r\n } else if (nodeType == DOM_COMMENT_NODE) {\r\n buffer.push(`<!-- ${nodeValue} -->`);\r\n } else if (nodeType == DOM_ELEMENT_NODE) {\r\n // If node didn't have a transformed name, but its children\r\n // had transformations, children should be present at output.\r\n // This is called here \"muted logic\".\r\n if (node.nodeName !== null && node.nodeName !== undefined) {\r\n xmlElementLogicTrivial(node, buffer, options);\r\n } else {\r\n xmlElementLogicMuted(node, buffer, options);\r\n }\r\n } else if (nodeType === DOM_DOCUMENT_NODE || nodeType === DOM_DOCUMENT_FRAGMENT_NODE) {\r\n let childNodes = node.firstChild ? [] : node.childNodes;\r\n if (node.firstChild) {\r\n let child = node.firstChild;\r\n while (child) {\r\n childNodes.push(child);\r\n child = child.nextSibling;\r\n }\r\n }\r\n childNodes.sort((a, b) => a.siblingPosition - b.siblingPosition);\r\n\r\n for (let i = 0; i < childNodes.length; ++i) {\r\n xmlTransformedTextRecursive(childNodes[i], buffer, options);\r\n }\r\n }\r\n\r\n node.visited = true;\r\n}\r\n\r\n/**\r\n * XML element output, trivial logic.\r\n * @param node The XML node.\r\n * @param buffer The XML buffer.\r\n * @param cdata If using CDATA configuration.\r\n */\r\nfunction xmlElementLogicTrivial(node: XNode, buffer: string[], options: XmlOutputOptions) {\r\n buffer.push(`<${xmlFullNodeName(node)}`);\r\n\r\n let attributes: XNode[] = [];\r\n if (node.firstChild) {\r\n let child = node.firstChild;\r\n while (child) {\r\n if (child.nodeType === DOM_ATTRIBUTE_NODE) {\r\n attributes.push(child);\r\n }\r\n child = child.nextSibling;\r\n }\r\n }\r\n if (attributes.length === 0) {\r\n attributes = node.childNodes.filter((n) => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n }\r\n\r\n for (let i = 0; i < attributes.length; ++i) {\r\n const attribute = attributes[i];\r\n if (!attribute) {\r\n continue;\r\n }\r\n\r\n if (attribute.nodeName && attribute.nodeValue) {\r\n buffer.push(` ${xmlFullNodeName(attribute)}=\"${xmlEscapeAttr(attribute.nodeValue)}\"`);\r\n }\r\n }\r\n\r\n let childNodes: XNode[] = [];\r\n if (node.firstChild) {\r\n let child = node.firstChild;\r\n while (child) {\r\n if (child.nodeType !== DOM_ATTRIBUTE_NODE) {\r\n childNodes.push(child);\r\n }\r\n child = child.nextSibling;\r\n }\r\n }\r\n if (childNodes.length === 0) {\r\n childNodes = node.childNodes.filter((n) => n.nodeType !== DOM_ATTRIBUTE_NODE);\r\n }\r\n\r\n childNodes = childNodes.sort((a, b) => a.siblingPosition - b.siblingPosition);\r\n if (childNodes.length === 0) {\r\n if (options.outputMethod === 'html' && ['hr', 'link', 'meta'].includes(node.nodeName)) {\r\n buffer.push('>');\r\n } else if (options.selfClosingTags) {\r\n buffer.push('/>');\r\n } else {\r\n buffer.push(`></${xmlFullNodeName(node)}>`);\r\n }\r\n } else {\r\n buffer.push('>');\r\n for (let i = 0; i < childNodes.length; ++i) {\r\n xmlTransformedTextRecursive(childNodes[i], buffer, options);\r\n }\r\n buffer.push(`</${xmlFullNodeName(node)}>`);\r\n }\r\n}\r\n\r\n/**\r\n * XML element output, muted logic.\r\n * In other words, this element should not be printed, but its\r\n * children can be printed if they have transformed values.\r\n * @param node The XML node.\r\n * @param buffer The XML buffer.\r\n * @param cdata If using CDATA configuration.\r\n */\r\nfunction xmlElementLogicMuted(node: XNode, buffer: any[], options: XmlOutputOptions) {\r\n let childNodes: XNode[] = [];\r\n if (node.firstChild) {\r\n let child = node.firstChild;\r\n while (child) {\r\n childNodes.push(child);\r\n child = child.nextSibling;\r\n }\r\n } else {\r\n childNodes = node.childNodes;\r\n }\r\n childNodes = childNodes.sort((a, b) => a.siblingPosition - b.siblingPosition);\r\n for (let i = 0; i < childNodes.length; ++i) {\r\n xmlTransformedTextRecursive(childNodes[i], buffer, options);\r\n }\r\n}\r\n\r\n/**\r\n * Gets the full node name.\r\n * When namespace is set, the node name is `namespace:node`.\r\n * @param node The node.\r\n * @returns The full node name as a string.\r\n */\r\nfunction xmlFullNodeName(node: XNode): string {\r\n const nodeName = node.nodeName;\r\n if (node.prefix && nodeName.indexOf(`${node.prefix}:`) != 0) {\r\n return `${node.prefix}:${nodeName}`;\r\n }\r\n\r\n return nodeName;\r\n}\r\n\r\n/**\r\n * Replaces HTML/XML entities to their literal characters.\r\n * Currently implementing only tag delimiters.\r\n * @param text The text to be transformed.\r\n * @returns The unescaped text.\r\n */\r\nexport function xmlUnescapeText(text: string): string {\r\n return `${text}`.replace(/&lt;/g, '<').replace(/&gt;/g, '>');\r\n}\r\n\r\n/**\r\n * Escape XML special markup characters: tag delimiter <, >, and entity\r\n * reference start delimiter &. The escaped string can be used in XML\r\n * text portions (i.e. between tags).\r\n * @param s The string to be escaped.\r\n * @returns The escaped string.\r\n */\r\nexport function xmlEscapeText(s: string): string {\r\n return `${s}`\r\n .replace(/&/g, '&amp;')\r\n .replace(/&amp;amp;/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;');\r\n}\r\n\r\n/**\r\n * Escape XML special markup characters: tag delimiter, <, >, entity\r\n * reference start delimiter &, and double quotes (\"). The escaped string can be\r\n * used in double quoted XML attribute value portions (i.e. in\r\n * attributes within start tags).\r\n * @param s The string to be escaped.\r\n * @returns The escaped string.\r\n */\r\nfunction xmlEscapeAttr(s: string): string {\r\n return xmlEscapeText(s).replace(/\"/g, '&quot;');\r\n}\r\n\r\n/**\r\n * Wrapper function to access attribute values of template element\r\n * nodes. Currently this calls he.decode because in some DOM\r\n * implementations the return value of node.getAttributeValue()\r\n * contains unresolved XML entities, although the DOM spec requires\r\n * that entity references are resolved by the DOM.\r\n * @param node TODO\r\n * @param name TODO\r\n * @returns TODO\r\n */\r\nexport function xmlGetAttribute(node: XNode, name: string): string {\r\n // TODO(mesch): This should not be necessary if the DOM is working\r\n // correctly. The DOM is responsible for resolving entities, not the\r\n // application.\r\n const value = domGetAttributeValue(node, name);\r\n if (value) {\r\n return he.decode(value);\r\n }\r\n\r\n return value;\r\n}\r\n\r\n/**\r\n * Wrapper function to access the owner document uniformly for document\r\n * and other nodes: for the document node, the owner document is the\r\n * node itself, for all others it's the ownerDocument property.\r\n *\r\n * @param {XNode} node\r\n * @return {XDocument}\r\n */\r\nexport function xmlOwnerDocument(node: XNode): XDocument {\r\n if (node === null || node === undefined) {\r\n throw new Error('Node has no valid owner document.');\r\n }\r\n\r\n if (node.nodeType === DOM_DOCUMENT_NODE) {\r\n return node as XDocument;\r\n }\r\n\r\n return xmlOwnerDocument(node.ownerDocument);\r\n}\r\n","import he from 'he';\r\nimport {\r\n domCreateElement,\r\n domSetAttribute,\r\n domAppendChild,\r\n domCreateTextNode,\r\n domCreateComment,\r\n domCreateCDATASection,\r\n domCreateDTDSection\r\n} from './functions';\r\n\r\nimport { XDocument } from './xdocument';\r\nimport {\r\n XML10_ATTRIBUTE,\r\n XML10_NAME,\r\n XML10_VERSION_INFO,\r\n XML11_ATTRIBUTE,\r\n XML11_NAME,\r\n XML11_VERSION_INFO\r\n} from './xmltoken';\r\nimport { XNode } from './xnode';\r\nimport { DOM_ATTRIBUTE_NODE } from '../constants';\r\n\r\n/**\r\n * Original author: Steffen Meschkat <mesch@google.com> (the `xmlParse` function,\r\n * now `xmlStrictParse`).\r\n *\r\n * An XML parse and a minimal DOM implementation that just supports\r\n * the subset of the W3C DOM that is used in the XSLT implementation.\r\n */\r\nexport class XmlParser {\r\n regexEmpty = /\\/$/;\r\n\r\n XML10_TAGNAME_REGEXP = new RegExp(`^(${XML10_NAME})`);\r\n XML10_ATTRIBUTE_REGEXP = new RegExp(XML10_ATTRIBUTE, 'g');\r\n\r\n XML11_TAGNAME_REGEXP = new RegExp(`^(${XML11_NAME})`);\r\n XML11_ATTRIBUTE_REGEXP = new RegExp(XML11_ATTRIBUTE, 'g');\r\n\r\n lenientHtmlTags = ['hr', 'link', 'meta'];\r\n\r\n /**\r\n * The entry point for this parser.\r\n * It verifies whether the document seems to be HTML.\r\n * HTML is a special case if XML and it should be parsed differently.\r\n * @param xmlOrHtml The XML or HTML content to be parsed.\r\n * @returns A DOM document.\r\n */\r\n xmlParse(xmlOrHtml: string): XDocument {\r\n if (xmlOrHtml.toUpperCase().startsWith('<!DOCTYPE HTML')) {\r\n return this.htmlParse(xmlOrHtml);\r\n }\r\n\r\n return this.xmlStrictParse(xmlOrHtml);\r\n }\r\n\r\n /**\r\n * Given an XNode, returns an object mapping prefixes to their corresponding namespaces in its scope.\r\n * Default namespace is treated as if its prefix were the empty string.\r\n * @param node The Node.\r\n * @returns An object with prefixes and namespace URLs.\r\n */\r\n private namespaceMapAt(node: XNode): { [prefix: string]: string } {\r\n const map = {\r\n // reserved namespaces: https://www.w3.org/TR/REC-xml-names/#xmlReserved\r\n xmlns: 'http://www.w3.org/2000/xmlns/',\r\n xml: 'http://www.w3.org/XML/1998/namespace'\r\n };\r\n let n = node;\r\n while (n !== null) {\r\n for (let i = 0; i < n.childNodes.length; i++) {\r\n const childNode = n.childNodes[i];\r\n if (childNode.nodeType !== DOM_ATTRIBUTE_NODE) {\r\n continue;\r\n }\r\n\r\n if (childNode.nodeName.startsWith('xmlns:')) {\r\n const prefix = childNode.nodeName.split(':')[1];\r\n if (!(prefix in map)) map[prefix] = childNode.nodeValue;\r\n } else if (childNode.nodeName == 'xmlns') {\r\n if (!('' in map)) map[''] = childNode.nodeValue || null;\r\n }\r\n }\r\n n = n.parentNode;\r\n }\r\n return map;\r\n }\r\n\r\n /**\r\n * HTML needs to be parsed differently because it's a special case of XML.\r\n * Sources:\r\n *\r\n * - https://blog.teamtreehouse.com/to-close-or-not-to-close-tags-in-html5\r\n * @param htmlText The HTML text\r\n * @returns A DOM document.\r\n */\r\n private htmlParse(htmlText: string): XDocument {\r\n const xmlDocument = new XDocument();\r\n const root = xmlDocument;\r\n const stack = [];\r\n\r\n let parent: XNode = root;\r\n stack.push(parent);\r\n\r\n let tag = false,\r\n quotes = false,\r\n doublequotes = false,\r\n start = 0;\r\n for (let i = 0; i < htmlText.length; ++i) {\r\n let char = htmlText.charAt(i);\r\n\r\n if (tag) {\r\n if (!doublequotes && char === \"'\") {\r\n quotes = !quotes;\r\n } else if (!quotes && char === '\"') {\r\n doublequotes = !doublequotes;\r\n } else if (!quotes && !doublequotes && char === '>') {\r\n let text = htmlText.slice(start, i);\r\n\r\n if (text.charAt(0) === '/') { // {\r\n stack.pop();\r\n parent = stack[stack.length - 1];\r\n } else if (text.charAt(0) === '!') {\r\n // Ignore comments\r\n // console.log(`Ignored ${text}`);\r\n } else {\r\n const empty = text.match(this.regexEmpty);\r\n const tagName = this.XML10_TAGNAME_REGEXP.exec(text)[1];\r\n let node = domCreateElement(xmlDocument, tagName);\r\n\r\n let attribute;\r\n while ((attribute = this.XML10_ATTRIBUTE_REGEXP.exec(text))) {\r\n const val = he.decode(attribute[5] || attribute[7] || '');\r\n domSetAttribute(node, attribute[1], val);\r\n }\r\n\r\n node.siblingPosition = parent.childNodes.length;\r\n domAppendChild(parent, node);\r\n\r\n // The fundamental difference between this parse function\r\n // and the strict XML parse is here:\r\n // HTML is lenient with certain tags, that don't need to be closed.\r\n if (!empty && !this.lenientHtmlTags.includes(tagName)) {\r\n parent = node;\r\n stack.push(node);\r\n }\r\n }\r\n\r\n start = i + 1;\r\n tag = false;\r\n quotes = false;\r\n doublequotes = false;\r\n }\r\n } else {\r\n if (char === '<') {\r\n let text = htmlText.slice(start, i);\r\n if (text && parent !== root) {\r\n domAppendChild(parent, domCreateTextNode(xmlDocument, text));\r\n }\r\n if (htmlText.slice(i + 1, i + 4) === '!--') {\r\n let endTagIndex = htmlText.slice(i + 4).indexOf('-->');\r\n if (endTagIndex) {\r\n let node = domCreateComment(xmlDocument, htmlText.slice(i + 4, i + endTagIndex + 4));\r\n domAppendChild(parent, node);\r\n i += endTagIndex + 6;\r\n }\r\n } else if (htmlText.slice(i + 1, i + 9) === '!DOCTYPE') {\r\n let endTagIndex = htmlText.slice(i + 9).indexOf('>');\r\n if (endTagIndex) {\r\n const dtdValue = htmlText.slice(i + 9, i + endTagIndex + 9).trimStart();\r\n // TODO: Not sure if this is a good solution.\r\n // Trying to implement this: https://github.com/DesignLiquido/xslt-processor/issues/30\r\n const node = domCreateDTDSection(xmlDocument, dtdValue);\r\n domAppendChild(parent, node);\r\n i += endTagIndex + dtdValue.length + 5;\r\n }\r\n } else {\r\n tag = true;\r\n }\r\n start = i + 1;\r\n }\r\n }\r\n }\r\n\r\n return xmlDocument;\r\n }\r\n\r\n /**\r\n * Parses the given XML string with our custom, JavaScript XML parser.\r\n * @param xml The XML String.\r\n * @returns A XDocument.\r\n * @author Steffen Meschkat <mesch@google.com>\r\n */\r\n private xmlStrictParse(xml: string): XDocument {\r\n let regexTagname: RegExp;\r\n let regexAttribute: RegExp;\r\n if (xml.match(/^<\\?xml/)) {\r\n // When an XML document begins with an XML declaration\r\n // VersionInfo must appear.\r\n if (xml.search(new RegExp(XML10_VERSION_INFO)) === 5) {\r\n regexTagname = this.XML10_TAGNAME_REGEXP;\r\n regexAttribute = this.XML10_ATTRIBUTE_REGEXP;\r\n } else if (xml.search(new RegExp(XML11_VERSION_INFO)) === 5) {\r\n regexTagname = this.XML11_TAGNAME_REGEXP;\r\n regexAttribute = this.XML11_ATTRIBUTE_REGEXP;\r\n } else {\r\n throw new Error('XML VersionInfo has an unknown version number.');\r\n }\r\n } else {\r\n // When an XML declaration is missing it's an XML 1.0 document.\r\n regexTagname = this.XML10_TAGNAME_REGEXP;\r\n regexAttribute = this.XML10_ATTRIBUTE_REGEXP;\r\n }\r\n\r\n const xmlDocument = new XDocument();\r\n const root = xmlDocument;\r\n const stack = [];\r\n\r\n let parent: XNode = root;\r\n stack.push(parent);\r\n\r\n let tag = false,\r\n quotes = false,\r\n doublequotes = false,\r\n start = 0;\r\n for (let i = 0; i < xml.length; ++i) {\r\n let char = xml.charAt(i);\r\n if (tag && !doublequotes && char === \"'\") {\r\n quotes = !quotes;\r\n } else if (tag && !quotes && char === '\"') {\r\n doublequotes = !doublequotes;\r\n } else if (tag && char === '>' && !quotes && !doublequotes) {\r\n let text = xml.slice(start, i);\r\n if (text.charAt(0) === '/') {\r\n stack.pop();\r\n parent = stack[stack.length - 1];\r\n } else if (text.charAt(0) === '?') {\r\n // Ignore XML declaration and processing instructions\r\n } else if (text.charAt(0) === '!') {\r\n // Ignore comments\r\n // console.log(`Ignored ${text}`);\r\n } else {\r\n const empty = text.match(this.regexEmpty);\r\n const tagname = regexTagname.exec(text)[1];\r\n let node = domCreateElement(xmlDocument, tagname);\r\n\r\n let attribute;\r\n while ((attribute = regexAttribute.exec(text))) {\r\n const val = he.decode(attribute[5] || attribute[7] || '');\r\n domSetAttribute(node, attribute[1], val);\r\n }\r\n\r\n node.siblingPosition = parent.childNodes.length;\r\n domAppendChild(parent, node);\r\n if (!empty) {\r\n parent = node;\r\n stack.push(node);\r\n }\r\n\r\n const namespaceMap = this.namespaceMapAt(node);\r\n if (node.prefix !== null) {\r\n if (node.prefix in namespaceMap) node.namespaceUri = namespaceMap[node.prefix];\r\n // else, prefix is undefined. do anything?\r\n } else {\r\n if ('' in namespaceMap) node.namespaceUri = namespaceMap[''];\r\n }\r\n\r\n for (let i = 0; i < node.childNodes.length; ++i) {\r\n const childNode = node.childNodes[i];\r\n if (childNode.nodeType !== DOM_ATTRIBUTE_NODE) {\r\n continue;\r\n }\r\n\r\n if (childNode.prefix !== null && childNode.prefix in namespaceMap) {\r\n childNode.namespaceUri = namespaceMap[childNode.prefix];\r\n // else, prefix undefined.\r\n }\r\n // elements with no prefix always have no namespace, so do nothing here.\r\n }\r\n }\r\n start = i + 1;\r\n tag = false;\r\n quotes = false;\r\n doublequotes = false;\r\n } else if (!tag && char === '<') {\r\n let text = xml.slice(start, i);\r\n if (text && parent !== root) {\r\n domAppendChild(parent, domCreateTextNode(xmlDocument, text));\r\n }\r\n if (xml.slice(i + 1, i + 4) === '!--') {\r\n let endTagIndex = xml.slice(i + 4).indexOf('-->');\r\n if (endTagIndex) {\r\n let node = domCreateComment(xmlDocument, xml.slice(i + 4, i + endTagIndex + 4));\r\n domAppendChild(parent, node);\r\n i += endTagIndex + 6;\r\n }\r\n } else if (xml.slice(i + 1, i + 9) === '![CDATA[') {\r\n let endTagIndex = xml.slice(i + 9).indexOf(']]>');\r\n if (endTagIndex) {\r\n let node = domCreateCDATASection(xmlDocument, xml.slice(i + 9, i + endTagIndex + 9));\r\n domAppendChild(parent, node);\r\n i += endTagIndex + 11;\r\n }\r\n } else if (xml.slice(i + 1, i + 9) === '!DOCTYPE') { // \"!DOCTYPE\" can be used in a XSLT template.\r\n let endTagIndex = xml.slice(i + 9).indexOf('>');\r\n if (endTagIndex) {\r\n const dtdValue = xml.slice(i + 9, i + endTagIndex + 9).trimStart();\r\n // TODO: Not sure if this is a good solution.\r\n // Trying to implement this: https://github.com/DesignLiquido/xslt-processor/issues/30\r\n const node = domCreateDTDSection(xmlDocument, dtdValue);\r\n domAppendChild(parent, node);\r\n i += endTagIndex + dtdValue.length + 5;\r\n }\r\n } else {\r\n tag = true;\r\n }\r\n start = i + 1;\r\n }\r\n }\r\n\r\n return root;\r\n }\r\n}\r\n","// Copyright 2023-2024 Design Liquido\r\n// Copyright 2018 Johannes Wilm\r\n// Copyright 2006 Google Inc.\r\n// All Rights Reserved\r\n//\r\n// Defines regular expression patterns to extract XML tokens from string.\r\n// See <http://www.w3.org/TR/REC-xml/#sec-common-syn>,\r\n// <http://www.w3.org/TR/xml11/#sec-common-syn> and\r\n// <http://www.w3.org/TR/REC-xml-names/#NT-NCName> for the specifications.\r\n//\r\n// Original author: Junji Takagi <jtakagi@google.com>\r\n\r\n// Common tokens in XML 1.0 and XML 1.1.\r\n\r\nconst XML_S = '[ \\t\\r\\n]+';\r\nconst XML_EQ = `(${XML_S})?=(${XML_S})?`;\r\nexport const XML_CHAR_REF = '&#[0-9]+;|&#x[0-9a-fA-F]+;';\r\n\r\n// XML 1.0 tokens.\r\n\r\nexport const XML10_VERSION_INFO = `${XML_S}version${XML_EQ}(\"1\\\\.0\"|'1\\\\.0')`;\r\nconst XML10_BASE_CHAR =\r\n '\\u0041-\\u005a\\u0061-\\u007a\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff' +\r\n '\\u0100-\\u0131\\u0134-\\u013e\\u0141-\\u0148\\u014a-\\u017e\\u0180-\\u01c3' +\r\n '\\u01cd-\\u01f0\\u01f4-\\u01f5\\u01fa-\\u0217\\u0250-\\u02a8\\u02bb-\\u02c1\\u0386' +\r\n '\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03ce\\u03d0-\\u03d6\\u03da\\u03dc' +\r\n '\\u03de\\u03e0\\u03e2-\\u03f3\\u0401-\\u040c\\u040e-\\u044f\\u0451-\\u045c' +\r\n '\\u045e-\\u0481\\u0490-\\u04c4\\u04c7-\\u04c8\\u04cb-\\u04cc\\u04d0-\\u04eb' +\r\n '\\u04ee-\\u04f5\\u04f8-\\u04f9\\u0531-\\u0556\\u0559\\u0561-\\u0586\\u05d0-\\u05ea' +\r\n '\\u05f0-\\u05f2\\u0621-\\u063a\\u0641-\\u064a\\u0671-\\u06b7\\u06ba-\\u06be' +\r\n '\\u06c0-\\u06ce\\u06d0-\\u06d3\\u06d5\\u06e5-\\u06e6\\u0905-\\u0939\\u093d' +\r\n '\\u0958-\\u0961\\u0985-\\u098c\\u098f-\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2' +\r\n '\\u09b6-\\u09b9\\u09dc-\\u09dd\\u09df-\\u09e1\\u09f0-\\u09f1\\u0a05-\\u0a0a' +\r\n '\\u0a0f-\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32-\\u0a33\\u0a35-\\u0a36' +\r\n '\\u0a38-\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8b\\u0a8d' +\r\n '\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2-\\u0ab3\\u0ab5-\\u0ab9' +\r\n '\\u0abd\\u0ae0\\u0b05-\\u0b0c\\u0b0f-\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30' +\r\n '\\u0b32-\\u0b33\\u0b36-\\u0b39\\u0b3d\\u0b5c-\\u0b5d\\u0b5f-\\u0b61\\u0b85-\\u0b8a' +\r\n '\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99-\\u0b9a\\u0b9c\\u0b9e-\\u0b9f\\u0ba3-\\u0ba4' +\r\n '\\u0ba8-\\u0baa\\u0bae-\\u0bb5\\u0bb7-\\u0bb9\\u0c05-\\u0c0c\\u0c0e-\\u0c10' +\r\n '\\u0c12-\\u0c28\\u0c2a-\\u0c33\\u0c35-\\u0c39\\u0c60-\\u0c61\\u0c85-\\u0c8c' +\r\n '\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cde\\u0ce0-\\u0ce1' +\r\n '\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d28\\u0d2a-\\u0d39\\u0d60-\\u0d61' +\r\n '\\u0e01-\\u0e2e\\u0e30\\u0e32-\\u0e33\\u0e40-\\u0e45\\u0e81-\\u0e82\\u0e84' +\r\n '\\u0e87-\\u0e88\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5' +\r\n '\\u0ea7\\u0eaa-\\u0eab\\u0ead-\\u0eae\\u0eb0\\u0eb2-\\u0eb3\\u0ebd\\u0ec0-\\u0ec4' +\r\n '\\u0f40-\\u0f47\\u0f49-\\u0f69\\u10a0-\\u10c5\\u10d0-\\u10f6\\u1100\\u1102-\\u1103' +\r\n '\\u1105-\\u1107\\u1109\\u110b-\\u110c\\u110e-\\u1112\\u113c\\u113e\\u1140\\u114c' +\r\n '\\u114e\\u1150\\u1154-\\u1155\\u1159\\u115f-\\u1161\\u1163\\u1165\\u1167\\u1169' +\r\n '\\u116d-\\u116e\\u1172-\\u1173\\u1175\\u119e\\u11a8\\u11ab\\u11ae-\\u11af' +\r\n '\\u11b7-\\u11b8\\u11ba\\u11bc-\\u11c2\\u11eb\\u11f0\\u11f9\\u1e00-\\u1e9b' +\r\n '\\u1ea0-\\u1ef9\\u1f00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d' +\r\n '\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc' +\r\n '\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec' +\r\n '\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2126\\u212a-\\u212b\\u212e\\u2180-\\u2182' +\r\n '\\u3041-\\u3094\\u30a1-\\u30fa\\u3105-\\u312c\\uac00-\\ud7a3';\r\nconst XML10_IDEOGRAPHIC = '\\u4e00-\\u9fa5\\u3007\\u3021-\\u3029';\r\nconst XML10_COMBINING_CHAR =\r\n '\\u0300-\\u0345\\u0360-\\u0361\\u0483-\\u0486\\u0591-\\u05a1\\u05a3-\\u05b9' +\r\n '\\u05bb-\\u05bd\\u05bf\\u05c1-\\u05c2\\u05c4\\u064b-\\u0652\\u0670\\u06d6-\\u06dc' +\r\n '\\u06dd-\\u06df\\u06e0-\\u06e4\\u06e7-\\u06e8\\u06ea-\\u06ed\\u0901-\\u0903\\u093c' +\r\n '\\u093e-\\u094c\\u094d\\u0951-\\u0954\\u0962-\\u0963\\u0981-\\u0983\\u09bc\\u09be' +\r\n '\\u09bf\\u09c0-\\u09c4\\u09c7-\\u09c8\\u09cb-\\u09cd\\u09d7\\u09e2-\\u09e3\\u0a02' +\r\n '\\u0a3c\\u0a3e\\u0a3f\\u0a40-\\u0a42\\u0a47-\\u0a48\\u0a4b-\\u0a4d\\u0a70-\\u0a71' +\r\n '\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0b01-\\u0b03' +\r\n '\\u0b3c\\u0b3e-\\u0b43\\u0b47-\\u0b48\\u0b4b-\\u0b4d\\u0b56-\\u0b57\\u0b82-\\u0b83' +\r\n '\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0c01-\\u0c03\\u0c3e-\\u0c44' +\r\n '\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55-\\u0c56\\u0c82-\\u0c83\\u0cbe-\\u0cc4' +\r\n '\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5-\\u0cd6\\u0d02-\\u0d03\\u0d3e-\\u0d43' +\r\n '\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1' +\r\n '\\u0eb4-\\u0eb9\\u0ebb-\\u0ebc\\u0ec8-\\u0ecd\\u0f18-\\u0f19\\u0f35\\u0f37\\u0f39' +\r\n '\\u0f3e\\u0f3f\\u0f71-\\u0f84\\u0f86-\\u0f8b\\u0f90-\\u0f95\\u0f97\\u0f99-\\u0fad' +\r\n '\\u0fb1-\\u0fb7\\u0fb9\\u20d0-\\u20dc\\u20e1\\u302a-\\u302f\\u3099\\u309a';\r\nconst XML10_DIGIT =\r\n '\\u0030-\\u0039\\u0660-\\u0669\\u06f0-\\u06f9\\u0966-\\u096f\\u09e6-\\u09ef' +\r\n '\\u0a66-\\u0a6f\\u0ae6-\\u0aef\\u0b66-\\u0b6f\\u0be7-\\u0bef\\u0c66-\\u0c6f' +\r\n '\\u0ce6-\\u0cef\\u0d66-\\u0d6f\\u0e50-\\u0e59\\u0ed0-\\u0ed9\\u0f20-\\u0f29';\r\nconst XML10_EXTENDER = '\\u00b7\\u02d0\\u02d1\\u0387\\u0640\\u0e46\\u0ec6\\u3005\\u3031-\\u3035' + '\\u309d-\\u309e\\u30fc-\\u30fe';\r\nconst XML10_LETTER = XML10_BASE_CHAR + XML10_IDEOGRAPHIC;\r\nconst XML10_NAME_CHAR = `${XML10_LETTER + XML10_DIGIT}\\\\._:${XML10_COMBINING_CHAR}${XML10_EXTENDER}-`;\r\nexport const XML10_NAME = `[${XML10_LETTER}_:][${XML10_NAME_CHAR}]*`;\r\n\r\nexport const XML10_ENTITY_REF = `&${XML10_NAME};`;\r\nconst XML10_REFERENCE = `${XML10_ENTITY_REF}|${XML_CHAR_REF}`;\r\nexport const XML10_ATT_VALUE = `\"(([^<&\"]|${XML10_REFERENCE})*)\"|'(([^<&']|${XML10_REFERENCE})*)'`;\r\nexport const XML10_ATTRIBUTE = `(${XML10_NAME})${XML_EQ}(${XML10_ATT_VALUE})`;\r\n\r\n// XML 1.1 tokens.\r\n// TODO(jtakagi): NameStartChar also includes \\u10000-\\ueffff.\r\n// ECMAScript Language Specifiction defines UnicodeEscapeSequence as\r\n// \"\\u HexDigit HexDigit HexDigit HexDigit\" and we may need to use\r\n// surrogate pairs, but any browser doesn't support surrogate paris in\r\n// character classes of regular expression, so avoid including them for now.\r\n\r\nexport const XML11_VERSION_INFO = `${XML_S}version${XML_EQ}(\"1\\\\.1\"|'1\\\\.1')`;\r\nconst XML11_NAME_START_CHAR =\r\n ':A-Z_a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02ff\\u0370-\\u037d' +\r\n '\\u037f-\\u1fff\\u200c-\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff' +\r\n '\\uf900-\\ufdcf\\ufdf0-\\ufffd';\r\nconst XML11_NAME_CHAR = XML11_NAME_START_CHAR + '\\\\.0-9\\u00b7\\u0300-\\u036f\\u203f-\\u2040-';\r\nexport const XML11_NAME = `[${XML11_NAME_START_CHAR}][${XML11_NAME_CHAR}]*`;\r\n\r\nexport const XML11_ENTITY_REF = `&${XML11_NAME};`;\r\nconst XML11_REFERENCE = `${XML11_ENTITY_REF}|${XML_CHAR_REF}`;\r\nexport const XML11_ATT_VALUE = `\"(([^<&\"]|${XML11_REFERENCE})*)\"|'(([^<&']|${XML11_REFERENCE})*)'`;\r\nexport const XML11_ATTRIBUTE = `(${XML11_NAME})${XML_EQ}(${XML11_ATT_VALUE})`;\r\n\r\n// XML Namespace tokens.\r\n// Used in XML parser and XPath parser.\r\n\r\nconst XML_NC_NAME_CHAR = `${XML10_LETTER + XML10_DIGIT}\\\\._${XML10_COMBINING_CHAR}${XML10_EXTENDER}-`;\r\nexport const XML_NC_NAME = `[${XML10_LETTER}_][${XML_NC_NAME_CHAR}]*`;\r\n","import { XNode, xmlValue } from \"../../dom\";\r\nimport { NodeValue } from \"./node-value\";\r\n\r\nexport class NodeSetValue implements NodeValue {\r\n value: XNode[];\r\n type: string;\r\n\r\n constructor(value: XNode[]) {\r\n this.value = value;\r\n this.type = 'node-set';\r\n }\r\n\r\n stringValue(): string {\r\n if (this.value.length === 0) {\r\n return '';\r\n }\r\n\r\n return xmlValue(this.value[0]);\r\n }\r\n\r\n booleanValue() {\r\n return this.value.length > 0;\r\n }\r\n\r\n numberValue() {\r\n return parseInt(this.stringValue()) - 0;\r\n }\r\n\r\n nodeSetValue(): XNode[] {\r\n return this.value;\r\n }\r\n}\r\n","// Copyright 2023-2024 Design Liquido\r\n// XPath adapter that uses the new lexer/parser implementation\r\n// while maintaining backward compatibility with the existing XSLT API.\r\n\r\nimport { XNode } from '../dom';\r\nimport { XPathLexer } from './lib/src/lexer';\r\nimport { XPathParser } from './lib/src/parser';\r\nimport { XPathExpression, XPathLocationPath, XPathUnionExpression } from './lib/src/expressions';\r\nimport { XPathContext, XPathResult, createContext } from './lib/src/context';\r\nimport { XPathNode } from './lib/src/node';\r\nimport { ExprContext } from './expr-context';\r\nimport { NodeValue, StringValue, NumberValue, BooleanValue, NodeSetValue } from './values';\r\n\r\n/**\r\n * Expression wrapper that provides backward-compatible interface.\r\n * Wraps new XPath expressions to work with old ExprContext.\r\n */\r\nexport class Expression {\r\n protected xpathExpression: XPathExpression;\r\n protected nodeConverter: NodeConverter;\r\n\r\n // Properties for LocationPath compatibility\r\n absolute?: boolean;\r\n steps?: any[];\r\n\r\n constructor(xpathExpression: XPathExpression, nodeConverter: NodeConverter) {\r\n this.xpathExpression = xpathExpression;\r\n this.nodeConverter = nodeConverter;\r\n\r\n // Extract properties if this is a location path\r\n if (xpathExpression instanceof XPathLocationPath) {\r\n this.absolute = xpathExpression.absolute;\r\n this.steps = xpathExpression.steps.map((step, index) => ({\r\n axis: step.axis,\r\n nodeTest: step.nodeTest,\r\n predicates: step.predicates,\r\n // Add methods needed by old code\r\n hasPositionalPredicate: false, // TODO: implement proper detection\r\n predicate: step.predicates || [],\r\n evaluate: (ctx: ExprContext) => {\r\n // Evaluate just this step\r\n const xpathCtx = this.nodeConverter.exprContextToXPathContext(ctx);\r\n const result = step.evaluate(xpathCtx);\r\n return this.nodeConverter.wrapResult(result, ctx);\r\n }\r\n }));\r\n }\r\n }\r\n\r\n /**\r\n * Evaluate the expression in the given context.\r\n */\r\n evaluate(context: ExprContext): NodeValue {\r\n const xpathContext = this.nodeConverter.exprContextToXPathContext(context);\r\n const result = this.xpathExpression.evaluate(xpathContext);\r\n return this.nodeConverter.wrapResult(result, context);\r\n }\r\n}\r\n\r\n/**\r\n * Location expression wrapper for XSLT pattern matching.\r\n */\r\nexport class LocationExpr extends Expression {\r\n declare absolute: boolean;\r\n declare steps: any[];\r\n\r\n constructor(xpathExpression: XPathLocationPath, nodeConverter: NodeConverter) {\r\n super(xpathExpression, nodeConverter);\r\n this.absolute = xpathExpression.absolute;\r\n this.steps = xpathExpression.steps.map(step => ({\r\n axis: step.axis,\r\n nodeTest: step.nodeTest,\r\n predicates: step.predicates || [],\r\n predicate: step.predicates || [],\r\n hasPositionalPredicate: this.hasPositionalPredicate(step.predicates || []),\r\n }));\r\n }\r\n\r\n private hasPositionalPredicate(predicates: XPathExpression[]): boolean {\r\n // TODO: Implement proper detection of positional predicates\r\n // For now, assume no positional predicates\r\n return false;\r\n }\r\n\r\n appendStep(step: any) {\r\n this.steps.push(step);\r\n }\r\n\r\n prependStep(step: any) {\r\n this.steps.unshift(step);\r\n }\r\n}\r\n\r\n/**\r\n * Union expression wrapper.\r\n */\r\nexport class UnionExpr extends Expression {\r\n expr1: Expression;\r\n expr2: Expression;\r\n\r\n constructor(\r\n xpathExpression: XPathUnionExpression,\r\n nodeConverter: NodeConverter,\r\n expr1: Expression,\r\n expr2: Expression\r\n ) {\r\n super(xpathExpression, nodeConverter);\r\n this.expr1 = expr1;\r\n this.expr2 = expr2;\r\n }\r\n}\r\n\r\n/**\r\n * Handles conversion between ExprContext and XPathContext.\r\n * Uses XNode directly as XPathNode-compatible objects to preserve node identity.\r\n */\r\nclass NodeConverter {\r\n /**\r\n * Convert ExprContext to XPathContext for the new XPath implementation.\r\n * XNodes are used directly since they implement enough of the XPathNode interface.\r\n */\r\n exprContextToXPathContext(exprContext: ExprContext): XPathContext {\r\n const currentNode = exprContext.nodeList[exprContext.position];\r\n // Use XNode directly - it's compatible enough with XPathNode\r\n const xpathNode = this.adaptXNode(currentNode);\r\n\r\n // Convert all nodes in the node list (needed for 'self-and-siblings' axis)\r\n const nodeList = exprContext.nodeList.map(node => this.adaptXNode(node));\r\n\r\n return createContext(xpathNode, {\r\n position: exprContext.position + 1, // XPath is 1-based\r\n size: exprContext.nodeList.length,\r\n nodeList: nodeList,\r\n variables: this.convertVariables(exprContext),\r\n functions: this.createCustomFunctions(exprContext),\r\n namespaces: exprContext.knownNamespaces,\r\n });\r\n }\r\n\r\n /**\r\n * Adapt XNode to be compatible with XPathNode interface.\r\n * We add missing properties but keep the original XNode reference.\r\n */\r\n adaptXNode(node: XNode): XPathNode {\r\n if (!node) return null;\r\n\r\n // XNode already has most properties, we just need to handle some differences\r\n // We add adapter properties without modifying the original object\r\n const adapted = node as any;\r\n\r\n // Add XPathNode-compatible properties if not present\r\n if (!('namespaceURI' in adapted)) {\r\n Object.defineProperty(adapted, 'namespaceURI', {\r\n get() { return this.namespaceUri; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n }\r\n\r\n if (!('textContent' in adapted)) {\r\n Object.defineProperty(adapted, 'textContent', {\r\n get() { return this._getTextContent(); },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n }\r\n\r\n if (!('_getTextContent' in adapted)) {\r\n adapted._getTextContent = function() {\r\n if (this.nodeType === 3 || this.nodeType === 2) { // TEXT_NODE or ATTRIBUTE_NODE\r\n return this.nodeValue || '';\r\n }\r\n if (!this.childNodes) return '';\r\n let text = '';\r\n for (const child of this.childNodes) {\r\n if (child.nodeType === 3) {\r\n text += child.nodeValue || '';\r\n } else if (child.nodeType === 1) {\r\n text += this._getTextContent.call(child);\r\n }\r\n }\r\n return text;\r\n };\r\n }\r\n\r\n if (!('attributes' in adapted)) {\r\n Object.defineProperty(adapted, 'attributes', {\r\n get() {\r\n return this.childNodes ? this.childNodes.filter((n: any) => n.nodeType === 2) : [];\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n }\r\n\r\n if (!('getAttribute' in adapted)) {\r\n adapted.getAttribute = function(name: string) {\r\n return this.getAttributeValue ? this.getAttributeValue(name) : null;\r\n };\r\n }\r\n\r\n return adapted as XPathNode;\r\n }\r\n\r\n /**\r\n * Convert XPathNode result back to XNode.\r\n * Since we're now using XNodes directly, this is mostly a type cast.\r\n */\r\n xPathNodeToXNode(xpathNode: XPathNode): XNode | null {\r\n if (!xpathNode) return null;\r\n // The nodes are already XNodes, just cast back\r\n return xpathNode as unknown as XNode;\r\n }\r\n\r\n /**\r\n * Get text content from an XNode.\r\n */\r\n private getTextContent(node: XNode): string {\r\n if (node.nodeType === 3 || node.nodeType === 2) { // TEXT_NODE or ATTRIBUTE_NODE\r\n return node.nodeValue || '';\r\n }\r\n\r\n if (!node.childNodes) return '';\r\n\r\n let text = '';\r\n for (const child of node.childNodes) {\r\n if (child.nodeType === 3) { // TEXT_NODE\r\n text += child.nodeValue || '';\r\n } else if (child.nodeType === 1) { // ELEMENT_NODE\r\n text += this.getTextContent(child);\r\n }\r\n }\r\n return text;\r\n }\r\n\r\n /**\r\n * Convert variables from ExprContext format to XPathContext format.\r\n */\r\n private convertVariables(exprContext: ExprContext): Record<string, any> {\r\n const variables: Record<string, any> = {};\r\n\r\n for (const [name, value] of Object.entries(exprContext.variables || {})) {\r\n if (value && typeof value === 'object' && 'stringValue' in value) {\r\n // It's a NodeValue, extract the raw value\r\n // Cast to any to access the type property which exists on concrete implementations\r\n const nodeValue = value as any;\r\n if (nodeValue.type === 'node-set') {\r\n variables[name] = (value as NodeSetValue).nodeSetValue().map(n => this.adaptXNode(n));\r\n } else if (nodeValue.type === 'string') {\r\n variables[name] = value.stringValue();\r\n } else if (nodeValue.type === 'number') {\r\n variables[name] = value.numberValue();\r\n } else if (nodeValue.type === 'boolean') {\r\n variables[name] = value.booleanValue();\r\n } else {\r\n // Unknown type, try to get string value\r\n variables[name] = value.stringValue();\r\n }\r\n } else {\r\n variables[name] = value;\r\n }\r\n }\r\n\r\n return variables;\r\n }\r\n\r\n /**\r\n * Create custom functions for XPath context (like key(), document(), etc.).\r\n */\r\n private createCustomFunctions(exprContext: ExprContext): Record<string, (...args: any[]) => any> {\r\n const functions: Record<string, (...args: any[]) => any> = {};\r\n\r\n // key() function - XSLT specific\r\n functions['key'] = (keyName: string, keyValue: string) => {\r\n const keyDef = exprContext.keys?.[keyName];\r\n if (keyDef && keyDef[keyValue]) {\r\n const nodeSetValue = keyDef[keyValue];\r\n return nodeSetValue.nodeSetValue().map((n: XNode) => this.adaptXNode(n));\r\n }\r\n return [];\r\n };\r\n\r\n // current() function - XSLT specific\r\n functions['current'] = () => {\r\n const currentNode = exprContext.nodeList[exprContext.position];\r\n return [this.adaptXNode(currentNode)];\r\n };\r\n\r\n // format-number() function - XSLT specific\r\n functions['format-number'] = (number: number, format: string, decimalFormatName?: string) => {\r\n const settings = exprContext.decimalFormatSettings;\r\n // Basic implementation - can be expanded\r\n return number.toLocaleString();\r\n };\r\n\r\n // xml-to-json() function - XSLT 3.0 specific\r\n functions['xml-to-json'] = (nodes: any) => {\r\n // Check XSLT version - only supported in 3.0\r\n if (exprContext.xsltVersion === '1.0') {\r\n throw new Error('xml-to-json() is not supported in XSLT 1.0. Use version=\"3.0\" in your stylesheet.');\r\n }\r\n\r\n // Handle node set or single node\r\n const node = Array.isArray(nodes) ? nodes[0] : nodes;\r\n if (!node) {\r\n return '\"\"';\r\n }\r\n\r\n // Convert XML node to JSON string\r\n return this.xmlToJson(node);\r\n };\r\n\r\n return functions;\r\n }\r\n\r\n /**\r\n * Convert an XML node to a JSON string representation.\r\n * This is a simplified implementation of XSLT 3.0's xml-to-json().\r\n */\r\n private xmlToJson(node: any): string {\r\n if (!node) {\r\n return '\"\"';\r\n }\r\n\r\n // Text node - return the text content as a JSON string\r\n if (node.nodeType === 3) { // TEXT_NODE\r\n const text = node.nodeValue || '';\r\n return JSON.stringify(text);\r\n }\r\n\r\n // Element node - get text content\r\n if (node.nodeType === 1) { // ELEMENT_NODE\r\n const textContent = this.getTextContent(node);\r\n return JSON.stringify(textContent);\r\n }\r\n\r\n // Attribute node\r\n if (node.nodeType === 2) { // ATTRIBUTE_NODE\r\n return JSON.stringify(node.nodeValue || '');\r\n }\r\n\r\n // Default\r\n return '\"\"';\r\n }\r\n\r\n /**\r\n * Wrap XPath result in appropriate NodeValue type.\r\n */\r\n wrapResult(result: XPathResult, exprContext: ExprContext): NodeValue {\r\n if (Array.isArray(result)) {\r\n // Node set - nodes are already XNodes (we use them directly)\r\n const xnodes = result.map(node => this.xPathNodeToXNode(node)).filter(n => n !== null) as XNode[];\r\n return new NodeSetValue(xnodes);\r\n }\r\n\r\n if (typeof result === 'string') {\r\n return new StringValue(result);\r\n }\r\n\r\n if (typeof result === 'number') {\r\n return new NumberValue(result);\r\n }\r\n\r\n if (typeof result === 'boolean') {\r\n return new BooleanValue(result);\r\n }\r\n\r\n // Default to empty node set\r\n return new NodeSetValue([]);\r\n }\r\n\r\n /**\r\n * Clear any internal state if needed.\r\n */\r\n clearCache() {\r\n // No caches to clear now that we use XNodes directly\r\n }\r\n}\r\n\r\n/**\r\n * XPath class that uses the new lexer/parser implementation\r\n * while maintaining API compatibility with the old implementation.\r\n */\r\nexport class XPath {\r\n private lexer: XPathLexer;\r\n private parser: XPathParser;\r\n private nodeConverter: NodeConverter;\r\n private parseCache: Map<string, Expression> = new Map();\r\n\r\n constructor() {\r\n this.lexer = new XPathLexer();\r\n this.parser = new XPathParser();\r\n this.nodeConverter = new NodeConverter();\r\n }\r\n\r\n /**\r\n * Parse an XPath expression and return an Expression object.\r\n * @param expression The XPath expression string.\r\n * @param axis Optional axis override for relative paths.\r\n */\r\n xPathParse(expression: string, axis?: string): Expression {\r\n const cacheKey = `${expression}:${axis || ''}`;\r\n\r\n if (this.parseCache.has(cacheKey)) {\r\n return this.parseCache.get(cacheKey)!;\r\n }\r\n\r\n const tokens = this.lexer.scan(expression);\r\n const xpathExpr = this.parser.parse(tokens);\r\n\r\n const wrappedExpr = this.wrapExpression(xpathExpr, axis);\r\n this.parseCache.set(cacheKey, wrappedExpr);\r\n\r\n return wrappedExpr;\r\n }\r\n\r\n /**\r\n * Parse and evaluate an XPath expression.\r\n * @param select The XPath expression string.\r\n * @param context The expression context.\r\n */\r\n xPathEval(select: string, context: ExprContext): NodeValue {\r\n const expression = this.xPathParse(select);\r\n return expression.evaluate(context);\r\n }\r\n\r\n /**\r\n * Sort nodes in context according to sort specifications.\r\n * @param context The expression context with nodes to sort.\r\n * @param sort Array of sort specifications.\r\n */\r\n xPathSort(context: ExprContext, sort: any[]) {\r\n if (sort.length === 0) {\r\n return;\r\n }\r\n\r\n const sortList: { node: XNode; key: { value: any; order: string }[] }[] = [];\r\n\r\n for (let i = 0; i < context.contextSize(); ++i) {\r\n const node = context.nodeList[i];\r\n const sortItem = {\r\n node,\r\n key: [] as { value: any; order: string }[]\r\n };\r\n const clonedContext = context.clone([node], 0);\r\n\r\n for (const s of sort) {\r\n const value = s.expr.evaluate(clonedContext);\r\n\r\n let evalue: any;\r\n if (s.type === 'text') {\r\n evalue = value.stringValue();\r\n } else if (s.type === 'number') {\r\n evalue = value.numberValue();\r\n }\r\n sortItem.key.push({\r\n value: evalue,\r\n order: s.order\r\n });\r\n }\r\n\r\n // Make sort stable by adding index as lowest priority\r\n sortItem.key.push({\r\n value: i,\r\n order: 'ascending'\r\n });\r\n\r\n sortList.push(sortItem);\r\n }\r\n\r\n sortList.sort(this.xPathSortByKey);\r\n\r\n const nodes: XNode[] = [];\r\n for (let i = 0; i < sortList.length; ++i) {\r\n const node = sortList[i].node;\r\n node.siblingPosition = i;\r\n nodes.push(node);\r\n }\r\n\r\n context.nodeList = nodes;\r\n context.setNode(0);\r\n }\r\n\r\n /**\r\n * Comparison function for sorting.\r\n */\r\n private xPathSortByKey(v1: any, v2: any): number {\r\n for (let i = 0; i < v1.key.length; ++i) {\r\n const o = v1.key[i].order === 'descending' ? -1 : 1;\r\n if (v1.key[i].value > v2.key[i].value) {\r\n return +1 * o;\r\n }\r\n if (v1.key[i].value < v2.key[i].value) {\r\n return -1 * o;\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Wrap a new XPath expression in the backward-compatible Expression class.\r\n */\r\n private wrapExpression(xpathExpr: XPathExpression, axis?: string): Expression {\r\n if (xpathExpr instanceof XPathLocationPath) {\r\n // Apply axis override if specified\r\n if (axis && xpathExpr.steps.length > 0 && !xpathExpr.absolute) {\r\n xpathExpr.steps[0].axis = axis as any;\r\n }\r\n return new LocationExpr(xpathExpr, this.nodeConverter);\r\n }\r\n\r\n if (xpathExpr instanceof XPathUnionExpression) {\r\n const expr1 = this.wrapExpression(xpathExpr.left, axis);\r\n const expr2 = this.wrapExpression(xpathExpr.right, axis);\r\n return new UnionExpr(xpathExpr, this.nodeConverter, expr1, expr2);\r\n }\r\n\r\n return new Expression(xpathExpr, this.nodeConverter);\r\n }\r\n\r\n /**\r\n * Clear parse cache (useful for testing or memory management).\r\n */\r\n clearCache() {\r\n this.parseCache.clear();\r\n this.nodeConverter.clearCache();\r\n }\r\n}\r\n","// Copyright 2023-2024 Design Liquido\r\n// XPath tokens and axis constants\r\n\r\n// The axes of XPath expressions.\r\nexport const xPathAxis = {\r\n ANCESTOR_OR_SELF: 'ancestor-or-self',\r\n ANCESTOR: 'ancestor',\r\n ATTRIBUTE: 'attribute',\r\n CHILD: 'child',\r\n DESCENDANT_OR_SELF: 'descendant-or-self',\r\n DESCENDANT: 'descendant',\r\n FOLLOWING_SIBLING: 'following-sibling',\r\n FOLLOWING: 'following',\r\n NAMESPACE: 'namespace',\r\n PARENT: 'parent',\r\n PRECEDING_SIBLING: 'preceding-sibling',\r\n PRECEDING: 'preceding',\r\n SELF: 'self',\r\n SELF_AND_SIBLINGS: 'self-and-siblings' // Doesn't exist officially.\r\n // It is here for a special case of `<xsl:apply-templates>`.\r\n};\r\n\r\n// Token rule for number matching (used by expr-context.ts)\r\nexport const TOK_NUMBER = {\r\n label: '[number]',\r\n prec: 35,\r\n re: new RegExp('^\\\\d+(\\\\.\\\\d*)?'),\r\n key: undefined\r\n};\r\n","import { DOM_DOCUMENT_NODE } from '../constants';\r\nimport { BooleanValue } from './values/boolean-value';\r\nimport { NodeSetValue } from './values/node-set-value';\r\nimport { NumberValue } from './values/number-value';\r\nimport { StringValue } from './values/string-value';\r\nimport { TOK_NUMBER } from './tokens';\r\nimport { XNode } from '../dom';\r\nimport { XsltDecimalFormatSettings } from '../xslt/xslt-decimal-format-settings';\r\nimport { NodeValue } from './values';\r\n\r\n/**\r\n * XPath expression evaluation context. An XPath context consists of a\r\n * DOM node, a list of DOM nodes that contains this node, a number\r\n * that represents the position of the single node in the list, and a\r\n * current set of variable bindings. (See XPath spec.)\r\n *\r\n * setVariable(name, expr) -- binds given XPath expression to the\r\n * name.\r\n *\r\n * getVariable(name) -- what the name says.\r\n *\r\n * setNode(position) -- sets the context to the node at the given\r\n * position. Needed to implement scoping rules for variables in\r\n * XPath. (A variable is visible to all subsequent siblings, not\r\n * only to its children.)\r\n *\r\n * set/isCaseInsensitive -- specifies whether node name tests should\r\n * be case sensitive. If you're executing xpaths against a regular\r\n * HTML DOM, you probably don't want case-sensitivity, because\r\n * browsers tend to disagree about whether elements & attributes\r\n * should be upper/lower case. If you're running xpaths in an\r\n * XSLT instance, you probably DO want case sensitivity, as per the\r\n * XSL spec.\r\n *\r\n * set/isReturnOnFirstMatch -- whether XPath evaluation should quit as soon\r\n * as a result is found. This is an optimization that might make sense if you\r\n * only care about the first result.\r\n *\r\n * set/isIgnoreNonElementNodesForNTA -- whether to ignore non-element nodes\r\n * when evaluating the \"node()\" any node test. While technically this is\r\n * contrary to the XPath spec, practically it can enhance performance\r\n * significantly, and makes sense if you a) use \"node()\" when you mean \"*\",\r\n * and b) use \"//\" when you mean \"/descendant::* /\".\r\n */\r\nexport class ExprContext {\r\n position: number;\r\n nodeList: XNode[];\r\n xsltVersion: '1.0' | '2.0' | '3.0';\r\n\r\n variables: { [name: string]: NodeValue };\r\n keys: { [name: string]: { [key: string]: NodeValue } };\r\n knownNamespaces: { [alias: string]: string };\r\n\r\n caseInsensitive: any;\r\n ignoreAttributesWithoutValue: any;\r\n returnOnFirstMatch: any;\r\n ignoreNonElementNodesForNTA: any;\r\n\r\n parent: ExprContext;\r\n root: XNode;\r\n decimalFormatSettings: XsltDecimalFormatSettings;\r\n\r\n inApplyTemplates: boolean;\r\n baseTemplateMatched: boolean;\r\n\r\n /**\r\n * Constructor -- gets the node, its position, the node set it\r\n * belongs to, and a parent context as arguments. The parent context\r\n * is used to implement scoping rules for variables: if a variable\r\n * is not found in the current context, it is looked for in the\r\n * parent context, recursively. Except for node, all arguments have\r\n * default values: default position is 0, default node set is the\r\n * set that contains only the node, and the default parent is null.\r\n *\r\n * Notice that position starts at 0 at the outside interface;\r\n * inside XPath expressions this shows up as position()=1.\r\n * @param nodeList TODO\r\n * @param opt_position TODO\r\n * @param opt_parent TODO\r\n * @param opt_caseInsensitive TODO\r\n * @param opt_ignoreAttributesWithoutValue TODO\r\n * @param opt_returnOnFirstMatch TODO\r\n * @param opt_ignoreNonElementNodesForNTA TODO\r\n */\r\n constructor(\r\n nodeList: XNode[],\r\n xsltVersion: '1.0' | '2.0' | '3.0' = '1.0',\r\n opt_position?: number,\r\n opt_decimalFormatSettings?: XsltDecimalFormatSettings,\r\n opt_variables?: { [name: string]: any },\r\n opt_knownNamespaces?: { [alias: string]: string },\r\n opt_parent?: ExprContext,\r\n opt_caseInsensitive?: any,\r\n opt_ignoreAttributesWithoutValue?: any,\r\n opt_returnOnFirstMatch?: any,\r\n opt_ignoreNonElementNodesForNTA?: any\r\n ) {\r\n this.nodeList = nodeList;\r\n this.xsltVersion = xsltVersion;\r\n\r\n this.position = opt_position || 0;\r\n\r\n this.variables = opt_variables || {};\r\n this.keys = opt_parent?.keys || {};\r\n this.knownNamespaces = opt_knownNamespaces || {};\r\n\r\n this.parent = opt_parent || null;\r\n this.caseInsensitive = opt_caseInsensitive || false;\r\n this.ignoreAttributesWithoutValue = opt_ignoreAttributesWithoutValue || false;\r\n this.returnOnFirstMatch = opt_returnOnFirstMatch || false;\r\n this.ignoreNonElementNodesForNTA = opt_ignoreNonElementNodesForNTA || false;\r\n this.inApplyTemplates = false;\r\n this.baseTemplateMatched = false;\r\n\r\n this.decimalFormatSettings = opt_decimalFormatSettings || {\r\n decimalSeparator: '.',\r\n groupingSeparator: ',',\r\n infinity: 'Infinity',\r\n minusSign: '-',\r\n naN: 'NaN',\r\n percent: '%',\r\n perMille: '‰',\r\n zeroDigit: '0',\r\n digit: '#',\r\n patternSeparator: ';'\r\n };\r\n\r\n if (opt_parent) {\r\n this.root = opt_parent.root;\r\n } else if (this.nodeList[this.position].nodeType == DOM_DOCUMENT_NODE) {\r\n // NOTE(mesch): DOM Spec stipulates that the ownerDocument of a\r\n // document is null. Our root, however is the document that we are\r\n // processing, so the initial context is created from its document\r\n // node, which case we must handle here explicitly.\r\n this.root = this.nodeList[this.position];\r\n } else {\r\n this.root = this.nodeList[this.position].ownerDocument;\r\n }\r\n }\r\n\r\n /**\r\n * clone() -- creates a new context with the current context as\r\n * parent. If passed as argument to clone(), the new context has a\r\n * different node, position, or node set. What is not passed is\r\n * inherited from the cloned context.\r\n * @param opt_nodeList TODO\r\n * @param opt_position TODO\r\n * @returns TODO\r\n */\r\n clone(opt_nodeList?: XNode[], opt_position?: number) {\r\n return new ExprContext(\r\n opt_nodeList || this.nodeList,\r\n this.xsltVersion,\r\n typeof opt_position !== 'undefined' ? opt_position : this.position,\r\n this.decimalFormatSettings,\r\n this.variables,\r\n this.knownNamespaces,\r\n this,\r\n this.caseInsensitive,\r\n this.ignoreAttributesWithoutValue,\r\n this.returnOnFirstMatch,\r\n this.ignoreNonElementNodesForNTA\r\n );\r\n }\r\n\r\n setVariable(name?: string, value?: NodeValue | string) {\r\n if (\r\n value instanceof StringValue ||\r\n value instanceof BooleanValue ||\r\n value instanceof NumberValue ||\r\n value instanceof NodeSetValue\r\n ) {\r\n this.variables[name] = value;\r\n return;\r\n }\r\n\r\n if ('true' === value) {\r\n this.variables[name] = new BooleanValue(true);\r\n } else if ('false' === value) {\r\n this.variables[name] = new BooleanValue(false);\r\n } else if (TOK_NUMBER.re.test(String(value))) {\r\n this.variables[name] = new NumberValue(value);\r\n } else {\r\n // DGF What if it's null?\r\n this.variables[name] = new StringValue(value);\r\n }\r\n }\r\n\r\n getVariable(name: string): NodeValue {\r\n if (typeof this.variables[name] != 'undefined') {\r\n return this.variables[name];\r\n }\r\n\r\n if (this.parent) {\r\n return this.parent.getVariable(name);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n setNode(position: number) {\r\n this.position = position;\r\n }\r\n\r\n contextSize() {\r\n return this.nodeList.length;\r\n }\r\n\r\n isCaseInsensitive() {\r\n return this.caseInsensitive;\r\n }\r\n\r\n setCaseInsensitive(caseInsensitive) {\r\n return (this.caseInsensitive = caseInsensitive);\r\n }\r\n\r\n isIgnoreAttributesWithoutValue() {\r\n return this.ignoreAttributesWithoutValue;\r\n }\r\n\r\n setIgnoreAttributesWithoutValue(ignore) {\r\n return (this.ignoreAttributesWithoutValue = ignore);\r\n }\r\n\r\n isReturnOnFirstMatch() {\r\n return this.returnOnFirstMatch;\r\n }\r\n\r\n setReturnOnFirstMatch(returnOnFirstMatch) {\r\n return (this.returnOnFirstMatch = returnOnFirstMatch);\r\n }\r\n\r\n isIgnoreNonElementNodesForNTA() {\r\n return this.ignoreNonElementNodesForNTA;\r\n }\r\n\r\n setIgnoreNonElementNodesForNTA(ignoreNonElementNodesForNTA) {\r\n return (this.ignoreNonElementNodesForNTA = ignoreNonElementNodesForNTA);\r\n }\r\n}\r\n","// Copyright 2023-2024 Design Liquido\r\n// Match resolver that works with the new XPath implementation.\r\n\r\nimport { XNode } from '../dom';\r\nimport { ExprContext } from './expr-context';\r\nimport { Expression, LocationExpr, UnionExpr } from './xpath';\r\n\r\n/**\r\n * Class that resolves XPath expressions, returning nodes.\r\n * This is used for XSLT pattern matching.\r\n */\r\nexport class MatchResolver {\r\n\r\n /**\r\n * Entry point for expression matching.\r\n * @param expression The expression to be resolved.\r\n * @param context The Expression Context.\r\n * @returns An array of nodes.\r\n */\r\n expressionMatch(expression: Expression, context: ExprContext): XNode[] {\r\n if (expression instanceof LocationExpr) {\r\n return this.locationExpressionMatch(expression, context);\r\n }\r\n\r\n if (expression instanceof UnionExpr) {\r\n return this.unionExpressionMatch(expression, context);\r\n }\r\n\r\n // For other expression types, evaluate and return node set\r\n try {\r\n const result = expression.evaluate(context);\r\n return result.nodeSetValue();\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n /**\r\n * Resolves a LocationExpr.\r\n * @param expression The Location Expression.\r\n * @param context The Expression Context.\r\n * @returns Either the results of a relative resolution, or the results of an\r\n * absolute resolution.\r\n */\r\n private locationExpressionMatch(expression: LocationExpr, context: ExprContext): XNode[] {\r\n if (!expression.steps || expression.steps.length <= 0) {\r\n // Handle \"/\" alone - matches the document root\r\n if (expression.absolute) {\r\n // Check if context node is the document node\r\n const contextNode = context.nodeList[context.position];\r\n if (contextNode.nodeName === '#document') {\r\n return [contextNode];\r\n }\r\n // Otherwise, no match\r\n return [];\r\n }\r\n // For relative expressions without steps, return current context node\r\n return [context.nodeList[context.position]];\r\n }\r\n\r\n if (expression.absolute) {\r\n // If expression is absolute and the axis of first step is self,\r\n // the match starts by the #document node.\r\n const firstStep = expression.steps[0];\r\n if (firstStep.axis === 'self') {\r\n return this.absoluteXsltMatchByDocumentNode(expression, context);\r\n }\r\n\r\n return this.absoluteXsltMatch(expression, context);\r\n }\r\n\r\n return this.relativeXsltMatch(expression, context);\r\n }\r\n\r\n /**\r\n * Resolves a UnionExpr.\r\n * @param expression The Union Expression.\r\n * @param context The Expression Context.\r\n * @returns The concatenated result of evaluating both sides of the expression.\r\n */\r\n private unionExpressionMatch(expression: UnionExpr, context: ExprContext): XNode[] {\r\n const expr1Nodes = this.expressionMatch(expression.expr1, context);\r\n return expr1Nodes.concat(this.expressionMatch(expression.expr2, context));\r\n }\r\n\r\n /**\r\n * Finds all the nodes through absolute XPath search, starting on\r\n * the #document parent node.\r\n * @param expression The Expression.\r\n * @param context The Expression Context.\r\n * @returns The list of found nodes.\r\n */\r\n private absoluteXsltMatchByDocumentNode(expression: LocationExpr, context: ExprContext): XNode[] {\r\n const clonedContext = context.clone([context.root], 0);\r\n const matchedNodes = expression.evaluate(clonedContext).nodeSetValue();\r\n const finalList: XNode[] = [];\r\n\r\n for (const element of matchedNodes) {\r\n if (element.id === context.nodeList[context.position].id) {\r\n finalList.push(element);\r\n }\r\n }\r\n\r\n return finalList;\r\n }\r\n\r\n /**\r\n * Finds all the nodes through absolute XPath search, starting with the\r\n * first child of the #document node.\r\n * @param expression The Expression.\r\n * @param context The Expression Context.\r\n * @returns The list of found nodes.\r\n */\r\n private absoluteXsltMatch(expression: LocationExpr, context: ExprContext): XNode[] {\r\n const firstChildOfRoot = context.root.childNodes.find((c: XNode) => c.nodeName !== '#dtd-section');\r\n if (!firstChildOfRoot) return [];\r\n\r\n const clonedContext = context.clone([firstChildOfRoot], 0);\r\n const matchedNodes = expression.evaluate(clonedContext).nodeSetValue();\r\n const finalList: XNode[] = [];\r\n\r\n // If the context is pointing to #document node, its child node is considered.\r\n let nodeList: XNode[];\r\n if (context.nodeList.length === 1 && context.nodeList[0].nodeName === '#document') {\r\n nodeList = [context.nodeList[0].childNodes.find((c: XNode) => c.nodeName !== '#dtd-section')];\r\n } else {\r\n nodeList = context.nodeList;\r\n }\r\n\r\n for (const element of matchedNodes) {\r\n if (element.id === nodeList[context.position]?.id) {\r\n finalList.push(element);\r\n }\r\n }\r\n\r\n return finalList;\r\n }\r\n\r\n /**\r\n * Tries to find relative nodes from the actual context position.\r\n * If found nodes are already in the context, or if they are children of\r\n * nodes in the context, they are returned.\r\n * @param expression The expression used.\r\n * @param context The Expression Context.\r\n * @returns The list of found nodes.\r\n */\r\n private relativeXsltMatch(expression: LocationExpr, context: ExprContext): XNode[] {\r\n const clonedContext = context.clone();\r\n const nodes = expression.evaluate(clonedContext).nodeSetValue();\r\n\r\n if (nodes.length === 1 && nodes[0].nodeName === '#document') {\r\n // As we don't work with the #document node directly, this part\r\n // returns its first sibling.\r\n return [nodes[0].childNodes[0]];\r\n }\r\n\r\n return nodes;\r\n }\r\n}\r\n","import { BooleanValue } from \"../values/boolean-value\";\r\nimport { NodeTest } from \"./node-test\";\r\n\r\nexport class NodeTestAny implements NodeTest {\r\n value: any;\r\n\r\n constructor() {\r\n this.value = new BooleanValue(true);\r\n }\r\n\r\n evaluate() {\r\n return this.value;\r\n }\r\n}\r\n","import { DOM_COMMENT_NODE } from \"../../constants\";\r\nimport { ExprContext } from \"../expr-context\";\r\nimport { NodeTest } from \"./node-test\";\r\nimport { BooleanValue } from \"../values/boolean-value\";\r\n\r\nexport class NodeTestComment implements NodeTest {\r\n evaluate(ctx: ExprContext) {\r\n return new BooleanValue(ctx.nodeList[ctx.position].nodeType == DOM_COMMENT_NODE);\r\n }\r\n}\r\n","import { DOM_ATTRIBUTE_NODE, DOM_ELEMENT_NODE } from \"../../constants\";\r\nimport { ExprContext } from \"../expr-context\";\r\nimport { BooleanValue } from \"../values/boolean-value\";\r\nimport { NodeTest } from \"./node-test\";\r\n\r\nexport class NodeTestElementOrAttribute implements NodeTest {\r\n evaluate(context: ExprContext) {\r\n const node = context.nodeList[context.position];\r\n return new BooleanValue(node.nodeType == DOM_ELEMENT_NODE || node.nodeType == DOM_ATTRIBUTE_NODE);\r\n }\r\n}\r\n","import { ExprContext } from \"../expr-context\";\r\nimport { NodeValue } from \"../values\";\r\nimport { BooleanValue } from \"../values/boolean-value\";\r\nimport { NodeTest } from \"./node-test\";\r\n\r\nexport class NodeTestName implements NodeTest {\r\n name: string;\r\n namespacePrefix: string;\r\n re: RegExp;\r\n\r\n constructor(name: string) {\r\n this.name = name;\r\n if (name.indexOf(':') > 0) {\r\n const nameAndNamespacePrefix = name.split(':');\r\n this.namespacePrefix = nameAndNamespacePrefix[0];\r\n this.name = nameAndNamespacePrefix[1];\r\n }\r\n\r\n this.re = new RegExp(`^${name}$`, 'i');\r\n }\r\n\r\n evaluate(context: ExprContext): NodeValue {\r\n const node = context.nodeList[context.position];\r\n if (this.namespacePrefix !== undefined) {\r\n const namespaceValue = context.knownNamespaces[this.namespacePrefix];\r\n if (namespaceValue !== node.namespaceUri) {\r\n return new BooleanValue(false);\r\n }\r\n\r\n if (context.caseInsensitive) {\r\n if (node.localName.length !== this.name.length) return new BooleanValue(false);\r\n return new BooleanValue(this.re.test(node.localName));\r\n }\r\n\r\n return new BooleanValue(node.localName === this.name);\r\n }\r\n\r\n if (context.caseInsensitive) {\r\n if (node.nodeName.length !== this.name.length) return new BooleanValue(false);\r\n return new BooleanValue(this.re.test(node.nodeName));\r\n }\r\n\r\n return new BooleanValue(node.nodeName === this.name);\r\n }\r\n}\r\n","import { ExprContext } from \"../expr-context\";\r\nimport { NodeTest } from \"./node-test\";\r\nimport { BooleanValue } from \"../values/boolean-value\";\r\n\r\nexport class NodeTestNC implements NodeTest {\r\n regex: RegExp;\r\n\r\n nsprefix: any;\r\n\r\n constructor(nsprefix: string) {\r\n this.regex = new RegExp(`^${nsprefix}:`);\r\n this.nsprefix = nsprefix;\r\n }\r\n\r\n evaluate(ctx: ExprContext) {\r\n const n = ctx.nodeList[ctx.position];\r\n return new BooleanValue(n.nodeName.match(this.regex));\r\n }\r\n}\r\n","import { DOM_PROCESSING_INSTRUCTION_NODE } from \"../../constants\";\r\nimport { ExprContext } from \"../expr-context\";\r\nimport { BooleanValue } from \"../values/boolean-value\";\r\nimport { NodeTest } from \"./node-test\";\r\n\r\nexport class NodeTestPI implements NodeTest {\r\n target: any;\r\n\r\n constructor(target: any) {\r\n this.target = target;\r\n }\r\n\r\n evaluate(context: ExprContext) {\r\n const node = context.nodeList[context.position];\r\n return new BooleanValue(\r\n node.nodeType == DOM_PROCESSING_INSTRUCTION_NODE && (!this.target || node.nodeName == this.target)\r\n );\r\n }\r\n}\r\n","import { DOM_TEXT_NODE } from \"../../constants\";\r\nimport { ExprContext } from \"../expr-context\";\r\nimport { BooleanValue } from \"../values/boolean-value\";\r\nimport { NodeTest } from \"./node-test\";\r\n\r\nexport class NodeTestText implements NodeTest {\r\n evaluate(ctx: ExprContext) {\r\n return new BooleanValue(ctx.nodeList[ctx.position].nodeType == DOM_TEXT_NODE);\r\n }\r\n}\r\n","import { XNode } from \"../dom/xnode\";\r\nimport { DOM_ELEMENT_NODE } from '../constants';\r\nimport { ExprContext, XPath, MatchResolver, Expression, LocationExpr, UnionExpr } from \"../xpath\";\r\nimport { TemplatePriority } from \"./template-priority\";\r\nimport { TemplateSelectionResult } from \"./template-selection-result\";\r\nimport { NodeTestAny, NodeTestComment, NodeTestElementOrAttribute, NodeTestName, NodeTestNC, NodeTestPI, NodeTestText } from \"../xpath/node-tests\";\r\n\r\n/**\r\n * Calculate the default priority for a single step pattern.\r\n *\r\n * According to XSLT 3.0 spec section 6.4:\r\n * - Priority -0.5: node tests of form node(), text(), comment(),\r\n * processing-instruction(), *, @*, namespace::*\r\n * - Priority -0.25: namespace wildcards like ns:*, @ns:*\r\n * - Priority 0: qualified names like foo, @bar, processing-instruction('literal')\r\n * - Priority 0.5: patterns with multiple steps or predicates\r\n */\r\nfunction calculateStepPriority(step: any): number {\r\n const nodeTest = step.nodeTest;\r\n const hasPredicates = (step.predicate && step.predicate.length > 0) ||\r\n (step.predicates && step.predicates.length > 0);\r\n\r\n // Predicates always result in 0.5\r\n if (hasPredicates) {\r\n return 0.5;\r\n }\r\n\r\n // Handle new XPath implementation's object-based node tests\r\n if (nodeTest && typeof nodeTest === 'object' && 'type' in nodeTest) {\r\n switch (nodeTest.type) {\r\n case 'wildcard':\r\n // Check for namespace wildcard like \"ns:*\"\r\n if (nodeTest.name && nodeTest.name.endsWith(':*')) {\r\n return -0.25;\r\n }\r\n // Regular wildcard * or @*\r\n return -0.5;\r\n\r\n case 'node-type':\r\n // node(), text(), comment(), processing-instruction()\r\n if (nodeTest.nodeType === 'processing-instruction' && nodeTest.name) {\r\n // processing-instruction('literal') has priority 0\r\n return 0;\r\n }\r\n return -0.5;\r\n\r\n case 'processing-instruction':\r\n // processing-instruction('literal') or processing-instruction()\r\n return nodeTest.name ? 0 : -0.5;\r\n\r\n case 'name':\r\n // Qualified name like foo, ns:foo, @bar\r\n return 0;\r\n\r\n default:\r\n return 0;\r\n }\r\n }\r\n\r\n // Handle legacy class-based node tests (for backward compatibility)\r\n if (nodeTest instanceof NodeTestAny) {\r\n // node() - matches any node\r\n return -0.5;\r\n }\r\n\r\n if (nodeTest instanceof NodeTestElementOrAttribute) {\r\n // * or @* - wildcard for elements or attributes\r\n return -0.5;\r\n }\r\n\r\n if (nodeTest instanceof NodeTestText) {\r\n // text()\r\n return -0.5;\r\n }\r\n\r\n if (nodeTest instanceof NodeTestComment) {\r\n // comment()\r\n return -0.5;\r\n }\r\n\r\n if (nodeTest instanceof NodeTestPI) {\r\n // processing-instruction() - with literal = 0, without = -0.5\r\n return nodeTest.target ? 0 : -0.5;\r\n }\r\n\r\n if (nodeTest instanceof NodeTestNC) {\r\n // Namespace wildcard like ns:* - priority -0.25\r\n return -0.25;\r\n }\r\n\r\n if (nodeTest instanceof NodeTestName) {\r\n // Qualified name like foo, ns:foo, @bar\r\n return 0;\r\n }\r\n\r\n // Default fallback\r\n return 0;\r\n}\r\n\r\n/**\r\n * Calculate the default priority for a location path expression.\r\n */\r\nfunction calculateLocationPathPriority(expr: LocationExpr): number {\r\n if (!expr.steps || expr.steps.length === 0) {\r\n // \"/\" alone (absolute path with no steps) matches the document root\r\n // According to XSLT spec, this has priority -0.5\r\n if (expr.absolute) {\r\n return -0.5;\r\n }\r\n return 0;\r\n }\r\n\r\n // Multiple steps = priority 0.5\r\n if (expr.steps.length > 1) {\r\n return 0.5;\r\n }\r\n\r\n // Single step - calculate based on the step's node test\r\n return calculateStepPriority(expr.steps[0]);\r\n}\r\n\r\n/**\r\n * Calculate the default priority for a union expression.\r\n * For union patterns like \"foo | bar\", each alternative is treated as a\r\n * separate rule. When used as a single template, we return the lowest priority\r\n * among all alternatives (most conservative).\r\n */\r\nfunction calculateUnionExprPriority(expr: UnionExpr, xPath: XPath): number {\r\n const priority1 = calculateDefaultPriorityFromExpression(expr.expr1, xPath);\r\n const priority2 = calculateDefaultPriorityFromExpression(expr.expr2, xPath);\r\n // Return the lowest (most conservative) priority for union patterns\r\n return Math.min(priority1, priority2);\r\n}\r\n\r\n/**\r\n * Calculate the default priority from a parsed expression.\r\n */\r\nfunction calculateDefaultPriorityFromExpression(expr: Expression, xPath: XPath): number {\r\n if (expr instanceof LocationExpr) {\r\n return calculateLocationPathPriority(expr);\r\n }\r\n\r\n if (expr instanceof UnionExpr) {\r\n return calculateUnionExprPriority(expr, xPath);\r\n }\r\n\r\n // For other expression types (filter, path, function call, etc.),\r\n // use priority 0.5 as they represent complex patterns\r\n return 0.5;\r\n}\r\n\r\n/**\r\n * Calculate the default priority for an XSLT pattern string.\r\n *\r\n * @param pattern The match pattern string (e.g., \"book\", \"chapter/title\", \"*\")\r\n * @param xPath The XPath instance for parsing\r\n * @returns The calculated default priority\r\n */\r\nexport function calculateDefaultPriority(pattern: string, xPath: XPath): number {\r\n try {\r\n const expr = xPath.xPathParse(pattern, 'self-and-siblings');\r\n return calculateDefaultPriorityFromExpression(expr, xPath);\r\n } catch (e) {\r\n // If parsing fails, return default priority 0\r\n console.warn(`Failed to parse pattern \"${pattern}\" for priority calculation:`, e);\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Check if a template matches the given mode.\r\n * A template matches if:\r\n * - mode is null/undefined and template has no mode attribute\r\n * - mode is '#all' (matches any template)\r\n * - template mode equals the given mode\r\n * - template mode is '#all'\r\n */\r\nfunction matchesMode(template: XNode, mode: string | null): boolean {\r\n const templateMode = template.getAttributeValue('mode');\r\n\r\n // If no mode specified in apply-templates, match templates without mode\r\n if (!mode) {\r\n return !templateMode || templateMode === '#default';\r\n }\r\n\r\n // Mode '#all' in apply-templates matches any template\r\n if (mode === '#all') {\r\n return true;\r\n }\r\n\r\n // Template with mode '#all' matches any mode\r\n if (templateMode === '#all') {\r\n return true;\r\n }\r\n\r\n // Direct mode match\r\n return templateMode === mode;\r\n}\r\n\r\n/**\r\n * Check if a node is an xsl:template element.\r\n */\r\nfunction isTemplate(node: XNode): boolean {\r\n if (node.nodeType !== DOM_ELEMENT_NODE) {\r\n return false;\r\n }\r\n\r\n // Check by namespace URI or prefix\r\n if (node.namespaceUri === 'http://www.w3.org/1999/XSL/Transform') {\r\n return node.localName === 'template';\r\n }\r\n\r\n return node.prefix === 'xsl' && node.localName === 'template';\r\n}\r\n\r\n/**\r\n * Collect all templates from the stylesheet with their priority metadata.\r\n *\r\n * @param stylesheetElement The root element of the stylesheet (xsl:stylesheet or xsl:transform)\r\n * @param mode The mode to filter templates by (null for default mode)\r\n * @param xPath The XPath instance for parsing patterns\r\n * @returns Array of templates with priority metadata\r\n */\r\nexport function collectAndExpandTemplates(\r\n stylesheetElement: XNode,\r\n mode: string | null,\r\n xPath: XPath\r\n): TemplatePriority[] {\r\n const templates: TemplatePriority[] = [];\r\n let docOrder = 0;\r\n\r\n for (const child of stylesheetElement.childNodes) {\r\n if (!isTemplate(child)) {\r\n continue;\r\n }\r\n\r\n if (!matchesMode(child, mode)) {\r\n continue;\r\n }\r\n\r\n const match = child.getAttributeValue('match');\r\n if (!match) {\r\n // Templates without match attribute are named templates, skip them\r\n continue;\r\n }\r\n\r\n const priorityAttr = child.getAttributeValue('priority');\r\n const explicitPriority = priorityAttr ? parseFloat(priorityAttr) : null;\r\n const defaultPriority = calculateDefaultPriority(match, xPath);\r\n const effectivePriority = explicitPriority !== null && !isNaN(explicitPriority)\r\n ? explicitPriority\r\n : defaultPriority;\r\n\r\n templates.push({\r\n template: child,\r\n explicitPriority: explicitPriority !== null && !isNaN(explicitPriority) ? explicitPriority : null,\r\n defaultPriority,\r\n effectivePriority,\r\n importPrecedence: 0, // TODO: Set properly when xsl:import is fully implemented\r\n documentOrder: docOrder++,\r\n matchPattern: match\r\n });\r\n }\r\n\r\n return templates;\r\n}\r\n\r\n/**\r\n * Split a pattern string by the union operator '|', respecting brackets and quotes.\r\n * For example: \"@*|node()\" -> [\"@*\", \"node()\"]\r\n * But: \"item[@id='a|b']\" -> [\"item[@id='a|b']\"] (not split inside quotes)\r\n *\r\n * @param pattern The pattern string to split\r\n * @returns Array of pattern alternatives\r\n */\r\nfunction splitUnionPattern(pattern: string): string[] {\r\n const alternatives: string[] = [];\r\n let current = '';\r\n let depth = 0; // Track bracket depth\r\n let inSingleQuote = false;\r\n let inDoubleQuote = false;\r\n\r\n for (let i = 0; i < pattern.length; i++) {\r\n const char = pattern[i];\r\n\r\n if (char === \"'\" && !inDoubleQuote) {\r\n inSingleQuote = !inSingleQuote;\r\n current += char;\r\n } else if (char === '\"' && !inSingleQuote) {\r\n inDoubleQuote = !inDoubleQuote;\r\n current += char;\r\n } else if (!inSingleQuote && !inDoubleQuote) {\r\n if (char === '[' || char === '(') {\r\n depth++;\r\n current += char;\r\n } else if (char === ']' || char === ')') {\r\n depth--;\r\n current += char;\r\n } else if (char === '|' && depth === 0) {\r\n // Union operator at top level\r\n alternatives.push(current.trim());\r\n current = '';\r\n } else {\r\n current += char;\r\n }\r\n } else {\r\n current += char;\r\n }\r\n }\r\n\r\n // Don't forget the last alternative\r\n if (current.trim()) {\r\n alternatives.push(current.trim());\r\n }\r\n\r\n return alternatives;\r\n}\r\n\r\n/**\r\n * Check if a node matches a single (non-union) pattern.\r\n *\r\n * @param node The node to test\r\n * @param pattern The match pattern string (should not contain union operator at top level)\r\n * @param context The original context (for namespace/variable info)\r\n * @param matchResolver The match resolver\r\n * @param xPath The XPath instance\r\n * @returns true if the node matches the pattern\r\n */\r\nfunction nodeMatchesSinglePattern(\r\n node: XNode,\r\n pattern: string,\r\n context: ExprContext,\r\n matchResolver: MatchResolver,\r\n xPath: XPath\r\n): boolean {\r\n // Special case for root pattern \"/\"\r\n if (pattern === '/') {\r\n return node.nodeName === '#document';\r\n }\r\n\r\n // Special case for attribute patterns like \"@class\", \"@*\", \"@ns:name\"\r\n if (pattern.startsWith('@')) {\r\n // Only attribute nodes (nodeType 2) can match attribute patterns\r\n if (node.nodeType !== 2) {\r\n return false;\r\n }\r\n const attrPattern = pattern.substring(1); // Remove '@'\r\n if (attrPattern === '*') {\r\n // @* matches any attribute\r\n return true;\r\n }\r\n // Match by attribute name (considering local name for namespaced attributes)\r\n const attrName = node.localName || node.nodeName;\r\n // Handle namespaced patterns like \"ns:name\" - just compare local names\r\n const patternLocalName = attrPattern.includes(':')\r\n ? attrPattern.substring(attrPattern.indexOf(':') + 1)\r\n : attrPattern;\r\n return attrName === patternLocalName || node.nodeName === attrPattern;\r\n }\r\n\r\n // For element patterns, we need to check if the node would be selected by the pattern\r\n // Create a context with just this node\r\n const nodeContext = context.clone([node], 0);\r\n\r\n // Try with 'self-and-siblings' axis - this works for patterns that don't start with *\r\n // because xPathParse will set the axis correctly\r\n try {\r\n const expr = xPath.xPathParse(pattern, 'self-and-siblings');\r\n const nodes = matchResolver.expressionMatch(expr, nodeContext);\r\n\r\n // Check if the current node is in the matched nodes\r\n if (nodes.some(n => n.id === node.id)) {\r\n return true;\r\n }\r\n } catch (e) {\r\n // Pattern parsing failed, try alternative approach\r\n }\r\n\r\n // For patterns starting with '*' (where axis override doesn't work),\r\n // check if the node passes the pattern test directly\r\n if (pattern === '*' && node.nodeType === DOM_ELEMENT_NODE) {\r\n return true;\r\n }\r\n\r\n // For patterns with predicates like \"item[@id='1']\" or multi-step patterns,\r\n // we need to evaluate from document root and check if node is in result\r\n if (pattern.includes('[') || pattern.includes('/')) {\r\n try {\r\n // Evaluate pattern from document root with descendant-or-self axis\r\n const rootContext = context.clone([context.root], 0);\r\n const descendantPattern = pattern.startsWith('/') ? pattern : '//' + pattern;\r\n const expr = xPath.xPathParse(descendantPattern);\r\n const nodes = matchResolver.expressionMatch(expr, rootContext);\r\n\r\n if (nodes.some(n => n.id === node.id)) {\r\n return true;\r\n }\r\n } catch (e) {\r\n // Pattern parsing failed\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if a node matches a given pattern.\r\n * This handles union patterns by splitting them and testing each alternative.\r\n *\r\n * @param node The node to test\r\n * @param pattern The match pattern string\r\n * @param context The original context (for namespace/variable info)\r\n * @param matchResolver The match resolver\r\n * @param xPath The XPath instance\r\n * @returns true if the node matches the pattern\r\n */\r\nfunction nodeMatchesPattern(\r\n node: XNode,\r\n pattern: string,\r\n context: ExprContext,\r\n matchResolver: MatchResolver,\r\n xPath: XPath\r\n): boolean {\r\n // Handle union patterns by splitting and testing each alternative\r\n const alternatives = splitUnionPattern(pattern);\r\n\r\n // If there are multiple alternatives, test each one\r\n // Return true if ANY alternative matches\r\n for (const alt of alternatives) {\r\n if (nodeMatchesSinglePattern(node, alt, context, matchResolver, xPath)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Select the best matching template from a list of templates.\r\n *\r\n * Selection rules (XSLT 3.0 spec section 6.4):\r\n * 1. Import precedence (higher wins)\r\n * 2. Effective priority (higher wins)\r\n * 3. Document order (last template wins if all else is equal)\r\n *\r\n * @param templates Array of templates with priority metadata\r\n * @param context The expression context for matching\r\n * @param matchResolver The match resolver for testing patterns\r\n * @param xPath The XPath instance for parsing\r\n * @returns The selection result\r\n */\r\nexport function selectBestTemplate(\r\n templates: TemplatePriority[],\r\n context: ExprContext,\r\n matchResolver: MatchResolver,\r\n xPath: XPath\r\n): TemplateSelectionResult {\r\n // 1. Filter to templates that match the current node\r\n const matching: TemplatePriority[] = [];\r\n const currentNode = context.nodeList[context.position];\r\n\r\n for (const t of templates) {\r\n try {\r\n if (nodeMatchesPattern(currentNode, t.matchPattern, context, matchResolver, xPath)) {\r\n matching.push(t);\r\n }\r\n } catch (e) {\r\n // If pattern matching fails, skip this template\r\n console.warn(`Failed to match pattern \"${t.matchPattern}\":`, e);\r\n }\r\n }\r\n\r\n if (matching.length === 0) {\r\n return {\r\n selectedTemplate: null,\r\n hasConflict: false,\r\n conflictingTemplates: []\r\n };\r\n }\r\n\r\n // 2. Sort by: importPrecedence DESC, effectivePriority DESC, documentOrder DESC\r\n matching.sort((a, b) => {\r\n // Higher import precedence wins\r\n if (a.importPrecedence !== b.importPrecedence) {\r\n return b.importPrecedence - a.importPrecedence;\r\n }\r\n // Higher priority wins\r\n if (a.effectivePriority !== b.effectivePriority) {\r\n return b.effectivePriority - a.effectivePriority;\r\n }\r\n // Later document order wins (last template wins)\r\n return b.documentOrder - a.documentOrder;\r\n });\r\n\r\n // 3. Detect conflicts - templates with same import precedence and priority\r\n const winner = matching[0];\r\n const conflicts = matching.filter(t =>\r\n t.importPrecedence === winner.importPrecedence &&\r\n t.effectivePriority === winner.effectivePriority\r\n );\r\n\r\n return {\r\n selectedTemplate: winner.template,\r\n hasConflict: conflicts.length > 1,\r\n conflictingTemplates: conflicts.length > 1 ? conflicts : []\r\n };\r\n}\r\n\r\n/**\r\n * Emit a warning when template conflicts are detected.\r\n *\r\n * @param result The template selection result\r\n * @param node The node being matched\r\n */\r\nexport function emitConflictWarning(result: TemplateSelectionResult, node: XNode): void {\r\n if (!result.hasConflict || result.conflictingTemplates.length < 2) {\r\n return;\r\n }\r\n\r\n const patterns = result.conflictingTemplates\r\n .map(t => `\"${t.matchPattern}\" (priority: ${t.effectivePriority})`)\r\n .join(', ');\r\n\r\n console.warn(\r\n `XSLT Warning: Ambiguous template match for node <${node.nodeName}>. ` +\r\n `Multiple templates match with equal priority: ${patterns}. ` +\r\n `Using the last one in document order.`\r\n );\r\n}\r\n","// Copyright 2023-2024 Design Liquido\r\n// Copyright 2018 Johannes Wilm\r\n// Copyright 2005 Google Inc.\r\n// All Rights Reserved\r\n//\r\n// Original author: Steffen Meschkat <mesch@google.com>\r\n\r\nimport {\r\n XDocument,\r\n XNode,\r\n XmlParser,\r\n domAppendChild,\r\n domCreateCDATASection,\r\n domCreateComment,\r\n domCreateDocumentFragment,\r\n domCreateElement,\r\n domCreateTextNode,\r\n domGetAttributeValue,\r\n domSetAttribute,\r\n xmlGetAttribute,\r\n xmlTransformedText,\r\n xmlValue,\r\n xmlValueLegacyBehavior\r\n} from '../dom';\r\nimport { ExprContext, XPath, MatchResolver } from '../xpath';\r\n\r\nimport {\r\n DOM_ATTRIBUTE_NODE,\r\n DOM_CDATA_SECTION_NODE,\r\n DOM_COMMENT_NODE,\r\n DOM_DOCUMENT_FRAGMENT_NODE,\r\n DOM_DOCUMENT_NODE,\r\n DOM_ELEMENT_NODE,\r\n DOM_TEXT_NODE\r\n} from '../constants';\r\n\r\nimport { StringValue, NodeSetValue, NodeValue } from '../xpath/values';\r\nimport { XsltOptions } from './xslt-options';\r\nimport { XsltDecimalFormatSettings } from './xslt-decimal-format-settings';\r\nimport {\r\n collectAndExpandTemplates,\r\n selectBestTemplate,\r\n emitConflictWarning\r\n} from './functions';\r\nimport { TemplatePriority } from './template-priority';\r\n\r\n/**\r\n * The main class for XSL-T processing. The implementation is NOT\r\n * complete; some xsl element are left out.\r\n *\r\n * References:\r\n *\r\n * [XSLT] XSL-T Specification\r\n * <http://www.w3.org/TR/1999/REC-xslt-19991116>.\r\n *\r\n * [ECMA] ECMAScript Language Specification\r\n * <http://www.ecma-international.org/publications/standards/Ecma-262.htm>.\r\n *\r\n * The XSL processor API has one entry point, the function\r\n * `xsltProcess()`. It receives as arguments the starting point in the\r\n * input document as an XPath expression context, the DOM root node of\r\n * the XSL-T stylesheet, and a DOM node that receives the output.\r\n *\r\n * NOTE: Actually, XSL-T processing according to the specification is\r\n * defined as operation on text documents, not as operation on DOM\r\n * trees. So, strictly speaking, this implementation is not an XSL-T\r\n * processor, but the processing engine that needs to be complemented\r\n * by an XML parser and serializer in order to be complete. Those two\r\n * are found in the `dom` folder.\r\n */\r\nexport class Xslt {\r\n xPath: XPath;\r\n xmlParser: XmlParser;\r\n matchResolver: MatchResolver;\r\n options: XsltOptions;\r\n decimalFormatSettings: XsltDecimalFormatSettings;\r\n\r\n outputDocument: XDocument;\r\n outputMethod: 'xml' | 'html' | 'text' | 'name' | 'xhtml';\r\n outputOmitXmlDeclaration: string;\r\n version: string;\r\n firstTemplateRan: boolean;\r\n\r\n /**\r\n * List of element name patterns from xsl:strip-space declarations.\r\n * Whitespace-only text nodes inside matching elements will be stripped.\r\n */\r\n stripSpacePatterns: string[];\r\n\r\n /**\r\n * List of element name patterns from xsl:preserve-space declarations.\r\n * Whitespace-only text nodes inside matching elements will be preserved.\r\n * preserve-space takes precedence over strip-space for conflicting patterns.\r\n */\r\n preserveSpacePatterns: string[];\r\n\r\n /**\r\n * Namespace aliases from xsl:namespace-alias declarations.\r\n * Maps stylesheet namespace prefixes to result namespace prefixes.\r\n */\r\n namespaceAliases: Map<string, string>;\r\n\r\n constructor(\r\n options: Partial<XsltOptions> = {\r\n cData: true,\r\n escape: true,\r\n selfClosingTags: true,\r\n parameters: []\r\n }\r\n ) {\r\n this.xPath = new XPath();\r\n this.xmlParser = new XmlParser();\r\n this.matchResolver = new MatchResolver();\r\n this.options = {\r\n cData: options.cData === true,\r\n escape: options.escape === true,\r\n selfClosingTags: options.selfClosingTags === true,\r\n parameters: options.parameters || []\r\n };\r\n this.outputMethod = 'xml';\r\n this.outputOmitXmlDeclaration = 'no';\r\n this.stripSpacePatterns = [];\r\n this.preserveSpacePatterns = [];\r\n this.namespaceAliases = new Map();\r\n this.decimalFormatSettings = {\r\n decimalSeparator: '.',\r\n groupingSeparator: ',',\r\n infinity: 'Infinity',\r\n minusSign: '-',\r\n naN: 'NaN',\r\n percent: '%',\r\n perMille: '‰',\r\n zeroDigit: '0',\r\n digit: '#',\r\n patternSeparator: ';'\r\n };\r\n this.firstTemplateRan = false;\r\n }\r\n\r\n /**\r\n * The exported entry point of the XSL-T processor.\r\n * @param xmlDoc The input document root, as DOM node.\r\n * @param stylesheet The stylesheet document root, as DOM node.\r\n * @returns the processed document, as XML text in a string.\r\n */\r\n async xsltProcess(xmlDoc: XDocument, stylesheet: XDocument) {\r\n const outputDocument = new XDocument();\r\n this.outputDocument = outputDocument;\r\n const expressionContext = new ExprContext([xmlDoc]);\r\n\r\n if (this.options.parameters.length > 0) {\r\n for (const parameter of this.options.parameters) {\r\n expressionContext.setVariable(parameter.name, new StringValue(parameter.value));\r\n }\r\n }\r\n\r\n await this.xsltProcessContext(expressionContext, stylesheet, this.outputDocument);\r\n const transformedOutputXml: string = xmlTransformedText(outputDocument, {\r\n cData: this.options.cData,\r\n escape: this.options.escape,\r\n selfClosingTags: this.options.selfClosingTags,\r\n outputMethod: this.outputMethod\r\n });\r\n\r\n return transformedOutputXml;\r\n }\r\n\r\n /**\r\n * The main entry point of the XSL-T processor, as explained on the top of the file.\r\n * @param context The input document root, as XPath `ExprContext`.\r\n * @param template The stylesheet document root, as DOM node.\r\n * @param output If set, the output where the transformation should occur.\r\n */\r\n protected async xsltProcessContext(context: ExprContext, template: XNode, output?: XNode) {\r\n if (!this.isXsltElement(template)) {\r\n await this.xsltPassThrough(context, template, output);\r\n } else {\r\n let node: XNode,\r\n select: any,\r\n value: any,\r\n nodes: XNode[];\r\n switch (template.localName) {\r\n case 'apply-imports':\r\n throw new Error(`not implemented: ${template.localName}`);\r\n case 'apply-templates':\r\n await this.xsltApplyTemplates(context, template, output);\r\n break;\r\n case 'attribute':\r\n await this.xsltAttribute(context, template, output);\r\n break;\r\n case 'attribute-set':\r\n throw new Error(`not implemented: ${template.localName}`);\r\n case 'call-template':\r\n await this.xsltCallTemplate(context, template, output);\r\n break;\r\n case 'choose':\r\n await this.xsltChoose(context, template, output);\r\n break;\r\n case 'comment':\r\n await this.xsltComment(context, template, output);\r\n break;\r\n case 'copy':\r\n node = this.xsltCopy(output || this.outputDocument, context.nodeList[context.position]);\r\n if (node) {\r\n await this.xsltChildNodes(context, template, node);\r\n }\r\n break;\r\n case 'copy-of':\r\n select = xmlGetAttribute(template, 'select');\r\n value = this.xPath.xPathEval(select, context);\r\n const destinationNode = output || this.outputDocument;\r\n if (value.type === 'node-set') {\r\n nodes = value.nodeSetValue();\r\n for (let i = 0; i < nodes.length; ++i) {\r\n this.xsltCopyOf(destinationNode, nodes[i]);\r\n }\r\n } else {\r\n let node = domCreateTextNode(this.outputDocument, value.stringValue());\r\n node.siblingPosition = destinationNode.childNodes.length;\r\n domAppendChild(destinationNode, node);\r\n }\r\n break;\r\n case 'decimal-format':\r\n this.xsltDecimalFormat(context, template);\r\n break;\r\n case 'element':\r\n await this.xsltElement(context, template, output);\r\n break;\r\n case 'fallback':\r\n throw new Error(`not implemented: ${template.localName}`);\r\n case 'for-each':\r\n await this.xsltForEach(context, template, output);\r\n break;\r\n case 'if':\r\n await this.xsltIf(context, template, output);\r\n break;\r\n case 'import':\r\n await this.xsltImport(context, template, output);\r\n break;\r\n case 'include':\r\n await this.xsltInclude(context, template, output);\r\n break;\r\n case 'key':\r\n this.xsltKey(context, template);\r\n break;\r\n case 'message':\r\n await this.xsltMessage(context, template);\r\n break;\r\n case 'namespace-alias':\r\n this.xsltNamespaceAlias(template);\r\n break;\r\n case 'number':\r\n this.xsltNumber(context, template, output);\r\n break;\r\n case 'otherwise':\r\n // xsl:otherwise is handled inside xsltChoose. If we reach here,\r\n // it means the element was used outside of xsl:choose.\r\n throw new Error(`<xsl:otherwise> must be a child of <xsl:choose>.`);\r\n case 'output':\r\n this.outputMethod = xmlGetAttribute(template, 'method') as 'xml' | 'html' | 'text' | 'name';\r\n this.outputOmitXmlDeclaration = xmlGetAttribute(template, 'omit-xml-declaration');\r\n break;\r\n case 'param':\r\n await this.xsltVariable(context, template, false);\r\n break;\r\n case 'preserve-space':\r\n this.xsltPreserveSpace(template);\r\n break;\r\n case 'processing-instruction':\r\n throw new Error(`not implemented: ${template.localName}`);\r\n case 'sort':\r\n this.xsltSort(context, template);\r\n break;\r\n case 'strip-space':\r\n this.xsltStripSpace(template);\r\n break;\r\n case 'stylesheet':\r\n case 'transform':\r\n await this.xsltTransformOrStylesheet(context, template, output);\r\n break;\r\n case 'template':\r\n await this.xsltTemplate(context, template, output);\r\n break;\r\n case 'text':\r\n this.xsltText(context, template, output);\r\n break;\r\n case 'value-of':\r\n this.xsltValueOf(context, template, output);\r\n break;\r\n case 'variable':\r\n await this.xsltVariable(context, template, true);\r\n break;\r\n case 'when':\r\n // xsl:when is handled inside xsltChoose. If we reach here,\r\n // it means the element was used outside of xsl:choose.\r\n throw new Error(`<xsl:when> must be a child of <xsl:choose>.`);\r\n case 'with-param':\r\n // xsl:with-param is handled inside xsltWithParam called from\r\n // xsltCallTemplate and xsltApplyTemplates. If we reach here,\r\n // it means the element was used outside of those contexts.\r\n throw new Error(`<xsl:with-param> must be a child of <xsl:call-template> or <xsl:apply-templates>.`);\r\n default:\r\n throw new Error(`error if here: ${template.localName}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:apply-templates`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output. Only used if there's no corresponding output node already defined.\r\n * @protected\r\n */\r\n protected async xsltApplyTemplates(context: ExprContext, template: XNode, output?: XNode) {\r\n const select = xmlGetAttribute(template, 'select');\r\n let nodes: XNode[] = [];\r\n if (select) {\r\n nodes = this.xPath.xPathEval(select, context).nodeSetValue();\r\n } else {\r\n nodes = context.nodeList[context.position].childNodes;\r\n }\r\n\r\n // TODO: Check why apply-templates was sorting and filing parameters\r\n // automatically.\r\n /* this.xsltWithParam(sortContext, template);\r\n this.xsltSort(sortContext, template); */\r\n\r\n const mode: string | null = xmlGetAttribute(template, 'mode');\r\n const top = template.ownerDocument.documentElement;\r\n\r\n // Collect all templates with their priority metadata\r\n const expandedTemplates: TemplatePriority[] = collectAndExpandTemplates(top, mode, this.xPath);\r\n\r\n const modifiedContext = context.clone(nodes);\r\n // Process nodes in document order, selecting the BEST matching template for each node.\r\n // This is the XSLT 3.0 compliant behavior - only ONE template executes per node.\r\n for (let j = 0; j < modifiedContext.contextSize(); ++j) {\r\n const currentNode = modifiedContext.nodeList[j];\r\n\r\n // If the current node is text, there's no need to test all the templates\r\n // against it. Just appending it to its parent is fine.\r\n if (currentNode.nodeType === DOM_TEXT_NODE) {\r\n const textNodeContext = context.clone(\r\n [currentNode],\r\n 0\r\n );\r\n this.commonLogicTextNode(textNodeContext, currentNode, output);\r\n } else {\r\n // For non-text nodes, select the BEST matching template based on priority\r\n const clonedContext = modifiedContext.clone(\r\n [currentNode],\r\n 0\r\n );\r\n clonedContext.inApplyTemplates = true;\r\n\r\n // Select the best template according to XSLT conflict resolution rules\r\n const selection = selectBestTemplate(\r\n expandedTemplates,\r\n clonedContext,\r\n this.matchResolver,\r\n this.xPath\r\n );\r\n\r\n // Emit warning if there's a conflict\r\n if (selection.hasConflict) {\r\n emitConflictWarning(selection, currentNode);\r\n }\r\n\r\n // Execute ONLY the selected template (not all matching templates)\r\n // We directly execute the template children here, bypassing xsltTemplate's\r\n // own matching logic since we've already determined this is the best match.\r\n if (selection.selectedTemplate) {\r\n await this.xsltChildNodes(clonedContext, selection.selectedTemplate, output);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:attribute`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output. Only used if there's no corresponding output node already defined.\r\n * @protected\r\n */\r\n protected async xsltAttribute(context: ExprContext, template: XNode, output?: XNode) {\r\n const nameExpr = xmlGetAttribute(template, 'name');\r\n const name = this.xsltAttributeValue(nameExpr, context);\r\n\r\n const documentFragment = domCreateDocumentFragment(this.outputDocument);\r\n await this.xsltChildNodes(context, template, documentFragment);\r\n const value = xmlValueLegacyBehavior(documentFragment);\r\n\r\n if (output) {\r\n domSetAttribute(output, name, value);\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:call-template`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output, used when a fragment is passed by a previous step.\r\n */\r\n protected async xsltCallTemplate(context: ExprContext, template: XNode, output?: XNode) {\r\n const name = xmlGetAttribute(template, 'name');\r\n const top = template.ownerDocument.documentElement;\r\n\r\n const paramContext = context.clone();\r\n await this.xsltWithParam(paramContext, template);\r\n\r\n for (let i = 0; i < top.childNodes.length; ++i) {\r\n let childNode = top.childNodes[i];\r\n if (\r\n childNode.nodeType === DOM_ELEMENT_NODE &&\r\n this.isXsltElement(childNode, 'template') &&\r\n domGetAttributeValue(childNode, 'name') === name\r\n ) {\r\n await this.xsltChildNodes(paramContext, childNode, output);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:choose`, its child nodes `xsl:when`, and\r\n * `xsl:otherwise`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output. Only used if there's no corresponding output node already defined.\r\n */\r\n protected async xsltChoose(context: ExprContext, template: XNode, output?: XNode) {\r\n for (const childNode of template.childNodes) {\r\n if (childNode.nodeType !== DOM_ELEMENT_NODE) {\r\n continue;\r\n }\r\n\r\n if (this.isXsltElement(childNode, 'when')) {\r\n const test = xmlGetAttribute(childNode, 'test');\r\n if (this.xPath.xPathEval(test, context).booleanValue()) {\r\n await this.xsltChildNodes(context, childNode, output);\r\n break;\r\n }\r\n } else if (this.isXsltElement(childNode, 'otherwise')) {\r\n await this.xsltChildNodes(context, childNode, output);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:copy` for all node types.\r\n * @param {XNode} destination the node being copied to, part of output document.\r\n * @param {XNode} source the node being copied, part in input document.\r\n * @returns {XNode|null} If an element node was created, the element node. Otherwise, null.\r\n */\r\n protected xsltCopy(destination: XNode, source: XNode): XNode {\r\n if (source.nodeType == DOM_ELEMENT_NODE) {\r\n let node = domCreateElement(this.outputDocument, source.nodeName);\r\n // node.transformedNodeName = source.nodeName;\r\n if (source.namespaceUri !== null && source.namespaceUri !== undefined) {\r\n domSetAttribute(node, 'xmlns', source.namespaceUri);\r\n }\r\n // Set siblingPosition to preserve insertion order during serialization\r\n node.siblingPosition = destination.childNodes.length;\r\n domAppendChild(destination, node);\r\n return node;\r\n }\r\n\r\n if (source.nodeType == DOM_TEXT_NODE) {\r\n // Check if this whitespace-only text node should be stripped\r\n if (this.shouldStripWhitespaceNode(source)) {\r\n return null;\r\n }\r\n let node = domCreateTextNode(this.outputDocument, source.nodeValue);\r\n node.siblingPosition = destination.childNodes.length;\r\n domAppendChild(destination, node);\r\n } else if (source.nodeType == DOM_CDATA_SECTION_NODE) {\r\n let node = domCreateCDATASection(this.outputDocument, source.nodeValue);\r\n node.siblingPosition = destination.childNodes.length;\r\n domAppendChild(destination, node);\r\n } else if (source.nodeType == DOM_COMMENT_NODE) {\r\n let node = domCreateComment(this.outputDocument, source.nodeValue);\r\n node.siblingPosition = destination.childNodes.length;\r\n domAppendChild(destination, node);\r\n } else if (source.nodeType == DOM_ATTRIBUTE_NODE) {\r\n domSetAttribute(destination, source.nodeName, source.nodeValue);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Implements `xsl:comment`. \r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output. Only used if there's no corresponding output node already defined. \r\n */\r\n protected async xsltComment(context: ExprContext, template: XNode, output?: XNode) {\r\n const node = domCreateDocumentFragment(this.outputDocument);\r\n await this.xsltChildNodes(context, template, node);\r\n const commentData = xmlValue(node);\r\n const commentNode = domCreateComment(this.outputDocument, commentData);\r\n const resolvedOutput = output || this.outputDocument;\r\n resolvedOutput.appendChild(commentNode);\r\n }\r\n\r\n /**\r\n * Implements `xsl:copy-of` for node-set values of the select\r\n * expression. Recurses down the source node tree, which is part of\r\n * the input document.\r\n * @param {XNode} destination the node being copied to, part of output document.\r\n * @param {XNode} source the node being copied, part in input document.\r\n */\r\n protected xsltCopyOf(destination: XNode, source: XNode): void {\r\n if (source.nodeType == DOM_DOCUMENT_FRAGMENT_NODE || source.nodeType == DOM_DOCUMENT_NODE) {\r\n for (let i = 0; i < source.childNodes.length; ++i) {\r\n this.xsltCopyOf(destination, source.childNodes[i]);\r\n }\r\n } else {\r\n const node = this.xsltCopy(destination, source);\r\n if (node) {\r\n for (let i = 0; i < source.childNodes.length; ++i) {\r\n this.xsltCopyOf(node, source.childNodes[i]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:decimal-format`, registering the settings in this instance\r\n * and the current context. \r\n * @param context The Expression Context.\r\n * @param template The template.\r\n */\r\n protected xsltDecimalFormat(context: ExprContext, template: XNode) {\r\n const name = xmlGetAttribute(template, 'name');\r\n const decimalSeparator = xmlGetAttribute(template, 'decimal-separator');\r\n const groupingSeparator = xmlGetAttribute(template, 'grouping-separator');\r\n const infinity = xmlGetAttribute(template, 'infinity');\r\n const minusSign = xmlGetAttribute(template, 'minus-sign');\r\n const naN = xmlGetAttribute(template, 'NaN');\r\n const percent = xmlGetAttribute(template, 'percent');\r\n const perMille = xmlGetAttribute(template, 'per-mille');\r\n const zeroDigit = xmlGetAttribute(template, 'zero-digit');\r\n const digit = xmlGetAttribute(template, 'digit');\r\n const patternSeparator = xmlGetAttribute(template, 'pattern-separator');\r\n this.decimalFormatSettings = {\r\n name: name || this.decimalFormatSettings.name,\r\n decimalSeparator: decimalSeparator || this.decimalFormatSettings.decimalSeparator,\r\n groupingSeparator: groupingSeparator || this.decimalFormatSettings.groupingSeparator,\r\n infinity: infinity || this.decimalFormatSettings.infinity,\r\n minusSign: minusSign || this.decimalFormatSettings.minusSign,\r\n naN: naN || this.decimalFormatSettings.naN,\r\n percent: percent || this.decimalFormatSettings.percent,\r\n perMille: perMille || this.decimalFormatSettings.perMille,\r\n zeroDigit: zeroDigit || this.decimalFormatSettings.zeroDigit,\r\n digit: digit || this.decimalFormatSettings.digit,\r\n patternSeparator: patternSeparator || this.decimalFormatSettings.patternSeparator\r\n };\r\n context.decimalFormatSettings = this.decimalFormatSettings;\r\n }\r\n\r\n /**\r\n * Implements `xsl:element`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n */\r\n protected async xsltElement(context: ExprContext, template: XNode, output?: XNode) {\r\n const nameExpr = xmlGetAttribute(template, 'name');\r\n const name = this.xsltAttributeValue(nameExpr, context);\r\n const node = domCreateElement(this.outputDocument, name);\r\n\r\n // node.transformedNodeName = name;\r\n\r\n domAppendChild(output || this.outputDocument, node);\r\n // The element becomes the output node of the source node.\r\n // context.nodeList[context.position].outputNode = node;\r\n const clonedContext = context.clone(undefined, 0);\r\n await this.xsltChildNodes(clonedContext, template, node);\r\n }\r\n\r\n /**\r\n * Implements `xsl:for-each`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output.\r\n */\r\n protected async xsltForEach(context: ExprContext, template: XNode, output?: XNode) {\r\n const select = xmlGetAttribute(template, 'select');\r\n const nodes = this.xPath.xPathEval(select, context).nodeSetValue();\r\n if (nodes.length === 0) {\r\n return;\r\n }\r\n\r\n // TODO: Why do we need this sort, really?\r\n // I have no idea why this logic is here (it was implemented\r\n // before Design Liquido taking over), so if it is proven not useful,\r\n // this entire logic must be removed.\r\n const sortContext = context.clone(nodes);\r\n this.xsltSort(sortContext, template);\r\n\r\n const nodesWithParent = sortContext.nodeList.filter((n) => n.parentNode !== null && n.parentNode !== undefined);\r\n if (nodesWithParent.length <= 0) {\r\n throw new Error('Nodes with no parents defined.');\r\n }\r\n\r\n for (let i = 0; i < sortContext.contextSize(); ++i) {\r\n await this.xsltChildNodes(sortContext.clone(sortContext.nodeList, i), template, output);\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:if`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output.\r\n */\r\n protected async xsltIf(context: ExprContext, template: XNode, output?: XNode) {\r\n const test = xmlGetAttribute(template, 'test');\r\n if (this.xPath.xPathEval(test, context).booleanValue()) {\r\n await this.xsltChildNodes(context, template, output);\r\n }\r\n }\r\n\r\n /**\r\n * Common implementation for `<xsl:import>` and `<xsl:include>`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output.\r\n * @param isImport Whether this is an import (true) or include (false).\r\n */\r\n protected async xsltImportOrInclude(context: ExprContext, template: XNode, output: XNode | undefined, isImport: boolean) {\r\n const elementName = isImport ? 'xsl:import' : 'xsl:include';\r\n const [major, minor] = process.versions.node.split('.').map(Number);\r\n if (major <= 17 && minor < 5) {\r\n throw new Error(`Your Node.js version does not support \\`<${elementName}>\\`. If possible, please update your Node.js version to at least version 17.5.0.`);\r\n }\r\n\r\n // We need to test here whether `window.fetch` is available or not.\r\n // If it is a browser environemnt, it should be.\r\n // Otherwise, we will need to import an equivalent library, like 'node-fetch'.\r\n if (!global.globalThis.fetch) {\r\n global.globalThis.fetch = fetch as any;\r\n global.globalThis.Headers = Headers as any;\r\n global.globalThis.Request = Request as any;\r\n global.globalThis.Response = Response as any;\r\n }\r\n\r\n const hrefAttributeFind = template.childNodes.filter(n => n.nodeName === 'href');\r\n if (hrefAttributeFind.length <= 0) {\r\n throw new Error(`<${elementName}> with no href attribute defined.`);\r\n }\r\n\r\n const hrefAttribute = hrefAttributeFind[0];\r\n\r\n const fetchTest = await global.globalThis.fetch(hrefAttribute.nodeValue);\r\n const fetchResponse = await fetchTest.text();\r\n const includedXslt = this.xmlParser.xmlParse(fetchResponse);\r\n await this.xsltChildNodes(context, includedXslt.childNodes[0], output);\r\n }\r\n\r\n /**\r\n * Implements `<xsl:import>`. For now the code is nearly identical to `<xsl:include>`, but there's\r\n * no precedence evaluation implemented yet.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output.\r\n */\r\n protected async xsltImport(context: ExprContext, template: XNode, output?: XNode) {\r\n await this.xsltImportOrInclude(context, template, output, true);\r\n }\r\n\r\n /**\r\n * Implements `xsl:include`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output.\r\n */\r\n protected async xsltInclude(context: ExprContext, template: XNode, output?: XNode) {\r\n await this.xsltImportOrInclude(context, template, output, false);\r\n }\r\n\r\n /**\r\n * Implements `xsl:key`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n */\r\n protected xsltKey(context: ExprContext, template: XNode) {\r\n // `name`, `match`, and `use` are required.\r\n const name: string = xmlGetAttribute(template, 'name');\r\n const match: string = xmlGetAttribute(template, 'match');\r\n const use: string = xmlGetAttribute(template, 'use');\r\n\r\n if (!name || !match || !use) {\r\n let errorMessage = '<xsl:key> missing required parameters: ';\r\n if (!name) {\r\n errorMessage += 'name, ';\r\n }\r\n\r\n if (!match) {\r\n errorMessage += 'match, ';\r\n }\r\n\r\n if (!use) {\r\n errorMessage += 'use, ';\r\n }\r\n\r\n errorMessage = errorMessage.slice(0, -2);\r\n throw new Error(errorMessage);\r\n }\r\n\r\n let keyContext: ExprContext;\r\n if (context.nodeList[context.position].nodeName === '#document') {\r\n keyContext = context.clone(context.nodeList[context.position].childNodes);\r\n } else {\r\n keyContext = context;\r\n }\r\n\r\n const nodes = this.xsltMatch(match, keyContext);\r\n if (!(name in context.keys)) {\r\n context.keys[name] = {};\r\n }\r\n\r\n for (const node of nodes) {\r\n const nodeContext = context.clone([node]);\r\n const attribute = this.xPath.xPathEval(use, nodeContext);\r\n const attributeValue = attribute.stringValue();\r\n context.keys[name][attributeValue] = new NodeSetValue([node]);\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:message`.\r\n * Outputs a message to the console. If terminate=\"yes\", throws an error to stop processing.\r\n * @param context The Expression Context.\r\n * @param template The `<xsl:message>` node.\r\n */\r\n protected async xsltMessage(context: ExprContext, template: XNode) {\r\n // Build the message content by processing child nodes\r\n const documentFragment = domCreateDocumentFragment(this.outputDocument);\r\n await this.xsltChildNodes(context, template, documentFragment);\r\n const messageText = xmlValue(documentFragment);\r\n\r\n // Check the terminate attribute\r\n const terminate = xmlGetAttribute(template, 'terminate') || 'no';\r\n\r\n // Output the message to console\r\n console.log(`[xsl:message] ${messageText}`);\r\n\r\n // If terminate=\"yes\", stop processing by throwing an error\r\n if (terminate === 'yes') {\r\n throw new Error(`xsl:message terminated: ${messageText}`);\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:namespace-alias`.\r\n * Declares that a namespace URI in the stylesheet should be replaced by a different\r\n * namespace URI in the output.\r\n * @param template The `<xsl:namespace-alias>` node.\r\n */\r\n protected xsltNamespaceAlias(template: XNode) {\r\n const stylesheetPrefix = xmlGetAttribute(template, 'stylesheet-prefix');\r\n const resultPrefix = xmlGetAttribute(template, 'result-prefix');\r\n\r\n if (!stylesheetPrefix || !resultPrefix) {\r\n throw new Error('<xsl:namespace-alias> requires both stylesheet-prefix and result-prefix attributes.');\r\n }\r\n\r\n // Store the alias mapping\r\n // \"#default\" represents the default namespace (no prefix)\r\n this.namespaceAliases.set(stylesheetPrefix, resultPrefix);\r\n }\r\n\r\n /**\r\n * Implements `xsl:number`.\r\n * Inserts a formatted number into the result tree.\r\n * @param context The Expression Context.\r\n * @param template The `<xsl:number>` node.\r\n * @param output The output node.\r\n */\r\n protected xsltNumber(context: ExprContext, template: XNode, output?: XNode) {\r\n const value = xmlGetAttribute(template, 'value');\r\n const level = xmlGetAttribute(template, 'level') || 'single';\r\n const count = xmlGetAttribute(template, 'count');\r\n const from = xmlGetAttribute(template, 'from');\r\n const format = xmlGetAttribute(template, 'format') || '1';\r\n const lang = xmlGetAttribute(template, 'lang');\r\n const letterValue = xmlGetAttribute(template, 'letter-value');\r\n const groupingSeparator = xmlGetAttribute(template, 'grouping-separator');\r\n const groupingSize = xmlGetAttribute(template, 'grouping-size');\r\n\r\n let number: number;\r\n\r\n if (value) {\r\n // If value attribute is present, evaluate it as an XPath expression\r\n const result = this.xPath.xPathEval(value, context);\r\n number = Math.round(result.numberValue());\r\n } else {\r\n // Otherwise, count nodes based on level, count, and from attributes\r\n number = this.xsltNumberCount(context, level, count, from);\r\n }\r\n\r\n // Format the number\r\n const formattedNumber = this.xsltFormatNumber(number, format, groupingSeparator, groupingSize);\r\n\r\n // Create text node with the formatted number\r\n const textNode = domCreateTextNode(this.outputDocument, formattedNumber);\r\n const targetOutput = output || this.outputDocument;\r\n textNode.siblingPosition = targetOutput.childNodes.length;\r\n domAppendChild(targetOutput, textNode);\r\n }\r\n\r\n /**\r\n * Counts nodes for xsl:number based on level, count, and from attributes.\r\n * @param context The Expression Context.\r\n * @param level The counting level: 'single', 'multiple', or 'any'.\r\n * @param count Pattern to match nodes to count.\r\n * @param from Pattern to start counting from.\r\n * @returns The count value.\r\n */\r\n protected xsltNumberCount(context: ExprContext, level: string, count: string | null, from: string | null): number {\r\n const currentNode = context.nodeList[context.position];\r\n\r\n // Default count pattern matches nodes with the same name and type as current node\r\n const countPattern = count || currentNode.nodeName;\r\n\r\n switch (level) {\r\n case 'single': {\r\n // Count preceding siblings (plus 1 for self) that match the count pattern\r\n let num = 1;\r\n let sibling = currentNode.previousSibling;\r\n while (sibling) {\r\n if (sibling.nodeType === currentNode.nodeType) {\r\n if (this.nodeMatchesPattern(sibling, countPattern)) {\r\n num++;\r\n }\r\n }\r\n sibling = sibling.previousSibling;\r\n }\r\n return num;\r\n }\r\n case 'multiple': {\r\n // For multiple level, we'd return a sequence - simplified to single value here\r\n // Full implementation would return array for hierarchical numbering\r\n let num = 1;\r\n let sibling = currentNode.previousSibling;\r\n while (sibling) {\r\n if (sibling.nodeType === currentNode.nodeType) {\r\n if (this.nodeMatchesPattern(sibling, countPattern)) {\r\n num++;\r\n }\r\n }\r\n sibling = sibling.previousSibling;\r\n }\r\n return num;\r\n }\r\n case 'any': {\r\n // Count all preceding nodes in document order that match\r\n let num = 1;\r\n const allNodes = this.getAllPrecedingNodes(currentNode);\r\n for (const node of allNodes) {\r\n if (this.nodeMatchesPattern(node, countPattern)) {\r\n num++;\r\n }\r\n }\r\n return num;\r\n }\r\n default:\r\n return 1;\r\n }\r\n }\r\n\r\n /**\r\n * Checks if a node matches a simple name pattern.\r\n * @param node The node to check.\r\n * @param pattern The pattern (node name) to match.\r\n * @returns True if the node matches.\r\n */\r\n protected nodeMatchesPattern(node: XNode, pattern: string): boolean {\r\n if (pattern === '*') {\r\n return node.nodeType === DOM_ELEMENT_NODE;\r\n }\r\n return node.nodeName === pattern || node.localName === pattern;\r\n }\r\n\r\n /**\r\n * Gets all nodes preceding the given node in document order.\r\n * @param node The reference node.\r\n * @returns Array of preceding nodes.\r\n */\r\n protected getAllPrecedingNodes(node: XNode): XNode[] {\r\n const result: XNode[] = [];\r\n\r\n // Get preceding siblings\r\n let sibling = node.previousSibling;\r\n while (sibling) {\r\n result.push(sibling);\r\n // Add descendants of preceding siblings\r\n this.collectDescendants(sibling, result);\r\n sibling = sibling.previousSibling;\r\n }\r\n\r\n // Get ancestors' preceding siblings\r\n let parent = node.parentNode;\r\n while (parent) {\r\n let parentSibling = parent.previousSibling;\r\n while (parentSibling) {\r\n result.push(parentSibling);\r\n this.collectDescendants(parentSibling, result);\r\n parentSibling = parentSibling.previousSibling;\r\n }\r\n parent = parent.parentNode;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Collects all descendant nodes of a given node.\r\n * @param node The parent node.\r\n * @param result The array to collect into.\r\n */\r\n protected collectDescendants(node: XNode, result: XNode[]): void {\r\n for (const child of node.childNodes) {\r\n if (child.nodeType === DOM_ELEMENT_NODE) {\r\n result.push(child);\r\n this.collectDescendants(child, result);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Formats a number according to the format string.\r\n * @param number The number to format.\r\n * @param format The format string (e.g., \"1\", \"01\", \"a\", \"A\", \"i\", \"I\").\r\n * @param groupingSeparator Optional grouping separator.\r\n * @param groupingSize Optional grouping size.\r\n * @returns The formatted number string.\r\n */\r\n protected xsltFormatNumber(\r\n number: number,\r\n format: string,\r\n groupingSeparator: string | null,\r\n groupingSize: string | null\r\n ): string {\r\n // Handle different format tokens\r\n const formatChar = format.charAt(0);\r\n\r\n let result: string;\r\n\r\n switch (formatChar) {\r\n case '1':\r\n result = number.toString();\r\n // Handle zero-padding (e.g., \"01\" -> \"01\", \"02\", etc.)\r\n if (format.length > 1 && format.match(/^0+1$/)) {\r\n const width = format.length;\r\n result = number.toString().padStart(width, '0');\r\n }\r\n break;\r\n case 'a':\r\n // Lowercase alphabetic: a, b, c, ..., z, aa, ab, ...\r\n result = this.numberToAlpha(number, false);\r\n break;\r\n case 'A':\r\n // Uppercase alphabetic: A, B, C, ..., Z, AA, AB, ...\r\n result = this.numberToAlpha(number, true);\r\n break;\r\n case 'i':\r\n // Lowercase Roman numerals\r\n result = this.numberToRoman(number).toLowerCase();\r\n break;\r\n case 'I':\r\n // Uppercase Roman numerals\r\n result = this.numberToRoman(number);\r\n break;\r\n default:\r\n result = number.toString();\r\n }\r\n\r\n // Apply grouping if specified\r\n if (groupingSeparator && groupingSize) {\r\n const size = parseInt(groupingSize, 10);\r\n if (size > 0 && !isNaN(size)) {\r\n result = this.applyGrouping(result, groupingSeparator, size);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts a number to alphabetic representation.\r\n * @param number The number to convert.\r\n * @param uppercase Whether to use uppercase letters.\r\n * @returns The alphabetic representation.\r\n */\r\n protected numberToAlpha(number: number, uppercase: boolean): string {\r\n if (number <= 0) return '';\r\n\r\n let result = '';\r\n while (number > 0) {\r\n number--;\r\n result = String.fromCharCode((number % 26) + (uppercase ? 65 : 97)) + result;\r\n number = Math.floor(number / 26);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts a number to Roman numeral representation.\r\n * @param number The number to convert.\r\n * @returns The Roman numeral string.\r\n */\r\n protected numberToRoman(number: number): string {\r\n if (number <= 0 || number > 3999) return number.toString();\r\n\r\n const romanNumerals: [number, string][] = [\r\n [1000, 'M'], [900, 'CM'], [500, 'D'], [400, 'CD'],\r\n [100, 'C'], [90, 'XC'], [50, 'L'], [40, 'XL'],\r\n [10, 'X'], [9, 'IX'], [5, 'V'], [4, 'IV'], [1, 'I']\r\n ];\r\n\r\n let result = '';\r\n for (const [value, numeral] of romanNumerals) {\r\n while (number >= value) {\r\n result += numeral;\r\n number -= value;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Applies grouping separators to a numeric string.\r\n * @param numStr The numeric string.\r\n * @param separator The grouping separator.\r\n * @param size The grouping size.\r\n * @returns The grouped string.\r\n */\r\n protected applyGrouping(numStr: string, separator: string, size: number): string {\r\n // Only apply to the integer part\r\n const parts = numStr.split('.');\r\n let intPart = parts[0];\r\n const decPart = parts[1];\r\n\r\n // Apply grouping from right to left\r\n let result = '';\r\n let count = 0;\r\n for (let i = intPart.length - 1; i >= 0; i--) {\r\n if (count > 0 && count % size === 0) {\r\n result = separator + result;\r\n }\r\n result = intPart[i] + result;\r\n count++;\r\n }\r\n\r\n return decPart ? result + '.' + decPart : result;\r\n }\r\n\r\n /**\r\n * Orders the current node list in the input context according to the\r\n * sort order specified by xsl:sort child nodes of the current\r\n * template node. This happens before the operation specified by the\r\n * current template node is executed.\r\n * @param context The expression context.\r\n * @param template The template node.\r\n * @todo case-order is not implemented.\r\n */\r\n protected xsltSort(context: ExprContext, template: XNode) {\r\n const sort: any[] = [];\r\n\r\n for (const childNode of template.childNodes) {\r\n if (childNode.nodeType == DOM_ELEMENT_NODE && this.isXsltElement(childNode, 'sort')) {\r\n const select = xmlGetAttribute(childNode, 'select');\r\n const expression = this.xPath.xPathParse(select);\r\n const type = xmlGetAttribute(childNode, 'data-type') || 'text';\r\n const order = xmlGetAttribute(childNode, 'order') || 'ascending';\r\n sort.push({\r\n expr: expression,\r\n type,\r\n order\r\n });\r\n }\r\n }\r\n\r\n this.xPath.xPathSort(context, sort);\r\n }\r\n\r\n /**\r\n * Implements `xsl:strip-space`.\r\n * Collects element name patterns for which whitespace-only text nodes should be stripped.\r\n * @param template The `<xsl:strip-space>` node.\r\n */\r\n protected xsltStripSpace(template: XNode) {\r\n const elements = xmlGetAttribute(template, 'elements');\r\n if (elements) {\r\n // Split on whitespace to get individual patterns (e.g., \"* book\" becomes [\"*\", \"book\"])\r\n const patterns = elements.trim().split(/\\s+/);\r\n this.stripSpacePatterns.push(...patterns);\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:preserve-space`.\r\n * Collects element name patterns for which whitespace-only text nodes should be preserved.\r\n * preserve-space takes precedence over strip-space for matching elements.\r\n * @param template The `<xsl:preserve-space>` node.\r\n */\r\n protected xsltPreserveSpace(template: XNode) {\r\n const elements = xmlGetAttribute(template, 'elements');\r\n if (elements) {\r\n // Split on whitespace to get individual patterns (e.g., \"pre code\" becomes [\"pre\", \"code\"])\r\n const patterns = elements.trim().split(/\\s+/);\r\n this.preserveSpacePatterns.push(...patterns);\r\n }\r\n }\r\n\r\n /**\r\n * Determines if a text node from the input document should be stripped.\r\n * This applies xsl:strip-space and xsl:preserve-space rules to whitespace-only text nodes.\r\n * @param textNode The text node to check.\r\n * @returns True if the text node should be stripped (not included in output).\r\n */\r\n protected shouldStripWhitespaceNode(textNode: XNode): boolean {\r\n // Only strip whitespace-only text nodes\r\n if (!textNode.nodeValue || !textNode.nodeValue.match(/^\\s*$/)) {\r\n return false;\r\n }\r\n\r\n // If no strip-space patterns are defined, don't strip\r\n if (this.stripSpacePatterns.length === 0) {\r\n return false;\r\n }\r\n\r\n const parentElement = textNode.parentNode;\r\n if (!parentElement || parentElement.nodeType !== DOM_ELEMENT_NODE) {\r\n return false;\r\n }\r\n\r\n // Check for xml:space=\"preserve\" on parent or ancestors (highest precedence)\r\n let ancestor = parentElement;\r\n while (ancestor && ancestor.nodeType === DOM_ELEMENT_NODE) {\r\n const xmlspace = domGetAttributeValue(ancestor, 'xml:space');\r\n if (xmlspace === 'preserve') {\r\n return false;\r\n }\r\n if (xmlspace === 'default') {\r\n break; // Continue to check strip-space/preserve-space rules\r\n }\r\n ancestor = ancestor.parentNode;\r\n }\r\n\r\n const parentName = parentElement.localName || parentElement.nodeName;\r\n\r\n // Check preserve-space patterns first (they take precedence over strip-space)\r\n for (const pattern of this.preserveSpacePatterns) {\r\n if (this.matchesNamePattern(parentName, pattern, parentElement)) {\r\n return false;\r\n }\r\n }\r\n\r\n // Check strip-space patterns\r\n for (const pattern of this.stripSpacePatterns) {\r\n if (this.matchesNamePattern(parentName, pattern, parentElement)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Matches an element name against a strip-space/preserve-space pattern.\r\n * Supports:\r\n * - \"*\" matches any element\r\n * - \"prefix:*\" matches any element in a namespace\r\n * - \"name\" matches elements with that local name\r\n * - \"prefix:name\" matches elements with that QName\r\n * @param elementName The local name of the element.\r\n * @param pattern The pattern to match against.\r\n * @param element The element node (for namespace checking).\r\n * @returns True if the element matches the pattern.\r\n */\r\n protected matchesNamePattern(elementName: string, pattern: string, element: XNode): boolean {\r\n // Universal match\r\n if (pattern === '*') {\r\n return true;\r\n }\r\n\r\n // Handle patterns with namespace prefixes\r\n if (pattern.includes(':')) {\r\n const [prefix, localPart] = pattern.split(':');\r\n\r\n // Check if element has a matching prefix\r\n const elementPrefix = element.prefix || '';\r\n\r\n if (localPart === '*') {\r\n // prefix:* - match any element in that namespace\r\n return elementPrefix === prefix;\r\n } else {\r\n // prefix:name - match specific element in namespace\r\n return elementPrefix === prefix && elementName === localPart;\r\n }\r\n }\r\n\r\n // Simple name match (no namespace prefix in pattern)\r\n return elementName === pattern;\r\n }\r\n\r\n /**\r\n * Implements `xsl:template`.\r\n * @param context The Expression Context.\r\n * @param template The `<xsl:template>` node.\r\n * @param output The output. In general, a fragment that will be used by \r\n * the caller.\r\n */\r\n protected async xsltTemplate(context: ExprContext, template: XNode, output?: XNode) {\r\n // If `<xsl:template>` is executed outside `<xsl:apply-templates>`,\r\n // only one match is accepted per level (or per context here).\r\n if (!context.inApplyTemplates && context.baseTemplateMatched) {\r\n return;\r\n }\r\n\r\n const match = xmlGetAttribute(template, 'match');\r\n if (!match) return;\r\n\r\n // XPath doesn't have an axis to select \"self and siblings\", and\r\n // the default axis is \"child\", so to select the correct children\r\n // in relative path, we force a 'self-and-siblings' axis.\r\n const nodes = this.xsltMatch(match, context, 'self-and-siblings');\r\n if (nodes.length > 0) {\r\n this.firstTemplateRan = true;\r\n if (!context.inApplyTemplates) {\r\n context.baseTemplateMatched = true;\r\n }\r\n\r\n const templateContext = context.clone(nodes, 0);\r\n await this.xsltChildNodes(templateContext, template, output);\r\n }\r\n }\r\n\r\n protected xsltText(context: ExprContext, template: XNode, output?: XNode) {\r\n const text = xmlValue(template);\r\n const node = domCreateTextNode(this.outputDocument, text);\r\n const disableOutputEscaping = template.childNodes.filter(\r\n (a) => a.nodeType === DOM_ATTRIBUTE_NODE && a.nodeName === 'disable-output-escaping'\r\n );\r\n if (disableOutputEscaping.length > 0 && disableOutputEscaping[0].nodeValue === 'yes') {\r\n node.escape = false;\r\n }\r\n const destinationTextNode = output || this.outputDocument;\r\n destinationTextNode.appendChild(node);\r\n }\r\n\r\n /**\r\n * Implements `<xsl:stylesheet>` and `<xsl:transform>`, and its corresponding\r\n * validations.\r\n * @param context The Expression Context.\r\n * @param template The `<xsl:stylesheet>` or `<xsl:transform>` node.\r\n * @param output The output. In general, a fragment that will be used by\r\n * the caller.\r\n */\r\n protected async xsltTransformOrStylesheet(context: ExprContext, template: XNode, output?: XNode): Promise<void> {\r\n for (let stylesheetAttribute of template.childNodes.filter((n) => n.nodeType === DOM_ATTRIBUTE_NODE)) {\r\n switch (stylesheetAttribute.nodeName) {\r\n case 'version':\r\n this.version = stylesheetAttribute.nodeValue;\r\n if (!['1.0', '2.0', '3.0'].includes(this.version)) {\r\n throw new Error(\r\n `XSLT version not defined or invalid. Actual resolved version: ${this.version || '(none)'}.`\r\n );\r\n }\r\n context.xsltVersion = this.version as any;\r\n break;\r\n default:\r\n if (stylesheetAttribute.prefix === 'xmlns') {\r\n context.knownNamespaces[stylesheetAttribute.localName] = stylesheetAttribute.nodeValue;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Validate that xsl:import elements are the first children (before any other elements)\r\n let importsDone = false;\r\n for (const child of template.childNodes) {\r\n if (child.nodeType === DOM_ELEMENT_NODE) {\r\n if (this.isXsltElement(child, 'import')) {\r\n if (importsDone) {\r\n throw new Error('<xsl:import> should be the first child node of <xsl:stylesheet> or <xsl:transform>.');\r\n }\r\n } else {\r\n importsDone = true;\r\n }\r\n }\r\n }\r\n\r\n // Separate templates from other stylesheet children (output, variable, key, etc.)\r\n const nonTemplates: XNode[] = [];\r\n const templates: XNode[] = [];\r\n\r\n for (const child of template.childNodes) {\r\n if (child.nodeType === DOM_ELEMENT_NODE && this.isXsltElement(child, 'template')) {\r\n templates.push(child);\r\n } else {\r\n nonTemplates.push(child);\r\n }\r\n }\r\n\r\n // Process non-template children first (declarations like output, variable, key, etc.)\r\n const contextClone = context.clone();\r\n for (const child of nonTemplates) {\r\n await this.xsltProcessContext(contextClone, child, output);\r\n }\r\n\r\n // Now select and execute the best matching template using priority rules\r\n if (templates.length > 0) {\r\n const expandedTemplates = collectAndExpandTemplates(template, null, this.xPath);\r\n\r\n // Find all (template, matchedNodes) pairs by testing each template's pattern\r\n const matchCandidates: { priority: TemplatePriority; matchedNodes: XNode[] }[] = [];\r\n\r\n for (const t of expandedTemplates) {\r\n try {\r\n // For initial template selection, evaluate patterns from document root\r\n // without axis override to ensure consistent matching for all patterns\r\n const matchedNodes = this.xsltMatch(t.matchPattern, contextClone);\r\n if (matchedNodes.length > 0) {\r\n matchCandidates.push({ priority: t, matchedNodes });\r\n }\r\n } catch (e) {\r\n // If pattern parsing fails, skip this template\r\n console.warn(`Failed to match pattern \"${t.matchPattern}\":`, e);\r\n }\r\n }\r\n\r\n if (matchCandidates.length > 0) {\r\n // Sort by: importPrecedence DESC, effectivePriority DESC, documentOrder DESC\r\n matchCandidates.sort((a, b) => {\r\n if (a.priority.importPrecedence !== b.priority.importPrecedence) {\r\n return b.priority.importPrecedence - a.priority.importPrecedence;\r\n }\r\n if (a.priority.effectivePriority !== b.priority.effectivePriority) {\r\n return b.priority.effectivePriority - a.priority.effectivePriority;\r\n }\r\n return b.priority.documentOrder - a.priority.documentOrder;\r\n });\r\n\r\n // Detect conflicts\r\n const winner = matchCandidates[0];\r\n const conflicts = matchCandidates.filter(t =>\r\n t.priority.importPrecedence === winner.priority.importPrecedence &&\r\n t.priority.effectivePriority === winner.priority.effectivePriority\r\n );\r\n\r\n if (conflicts.length > 1) {\r\n const patterns = conflicts\r\n .map(t => `\"${t.priority.matchPattern}\" (priority: ${t.priority.effectivePriority})`)\r\n .join(', ');\r\n console.warn(\r\n `XSLT Warning: Ambiguous template match. ` +\r\n `Multiple templates match with equal priority: ${patterns}. ` +\r\n `Using the last one in document order.`\r\n );\r\n }\r\n\r\n // Execute ONLY the selected template\r\n this.firstTemplateRan = true;\r\n contextClone.baseTemplateMatched = true;\r\n const templateContext = contextClone.clone(winner.matchedNodes, 0);\r\n await this.xsltChildNodes(templateContext, winner.priority.template, output);\r\n }\r\n }\r\n }\r\n\r\n protected xsltValueOf(context: ExprContext, template: XNode, output?: XNode) {\r\n const select = xmlGetAttribute(template, 'select');\r\n const attribute = this.xPath.xPathEval(select, context);\r\n const value = attribute.stringValue();\r\n const node = domCreateTextNode(this.outputDocument, value);\r\n // Set siblingPosition to preserve insertion order during serialization\r\n const targetOutput = output || this.outputDocument;\r\n node.siblingPosition = targetOutput.childNodes.length;\r\n\r\n targetOutput.appendChild(node);\r\n }\r\n\r\n /**\r\n * Evaluates a variable or parameter and set it in the current input\r\n * context. Implements `xsl:variable`, `xsl:param`, and `xsl:with-param`.\r\n *\r\n * @param context The expression context.\r\n * @param template The template node.\r\n * @param override flag that defines if the value computed here\r\n * overrides the one already in the input context if that is the\r\n * case. I.e. decides if this is a default value or a local\r\n * value. `xsl:variable` and `xsl:with-param` override; `xsl:param` doesn't.\r\n */\r\n protected async xsltVariable(context: ExprContext, template: XNode, override: boolean) {\r\n const name = xmlGetAttribute(template, 'name');\r\n const select = xmlGetAttribute(template, 'select');\r\n\r\n let value: NodeValue;\r\n\r\n const nonAttributeChildren = template.childNodes.filter((n) => n.nodeType !== DOM_ATTRIBUTE_NODE);\r\n if (nonAttributeChildren.length > 0) {\r\n const fragment = domCreateDocumentFragment(template.ownerDocument);\r\n await this.xsltChildNodes(context, template, fragment);\r\n value = new NodeSetValue([fragment]);\r\n } else if (select) {\r\n value = this.xPath.xPathEval(select, context);\r\n } else {\r\n let parameterValue = '';\r\n const filteredParameter = this.options.parameters.filter((p) => p.name === name);\r\n if (filteredParameter.length > 0) {\r\n parameterValue = filteredParameter[0].value;\r\n }\r\n value = new StringValue(parameterValue);\r\n }\r\n\r\n if (override || !context.getVariable(name)) {\r\n context.setVariable(name, value);\r\n }\r\n }\r\n\r\n /**\r\n * Traverses the template node tree. Calls the main processing\r\n * function with the current input context for every child node of the\r\n * current template node.\r\n * @param context Normally the Expression Context.\r\n * @param template The XSL-T definition.\r\n * @param output If set, the output where the transformation should occur.\r\n */\r\n protected async xsltChildNodes(context: ExprContext, template: XNode, output?: XNode) {\r\n // Clone input context to keep variables declared here local to the\r\n // siblings of the children.\r\n const contextClone = context.clone();\r\n for (let i = 0; i < template.childNodes.length; ++i) {\r\n await this.xsltProcessContext(contextClone, template.childNodes[i], output);\r\n }\r\n }\r\n\r\n /**\r\n * This logic is used in two different places:\r\n * - `xsltPassThrough`, if the template asks this library to write a text node;\r\n * - `xsltProcessContext`, `apply-templates` operation, when the current node is text.\r\n * \r\n * Text nodes always require a parent, and they never have children.\r\n * @param context The Expression Context.\r\n * @param template The template, that contains the node value to be written.\r\n * @param output The output.\r\n */\r\n private commonLogicTextNode(context: ExprContext, template: XNode, output: XNode) {\r\n if (output) {\r\n // Check if this whitespace-only text node should be stripped based on\r\n // xsl:strip-space and xsl:preserve-space declarations\r\n if (this.shouldStripWhitespaceNode(template)) {\r\n return;\r\n }\r\n\r\n let node = domCreateTextNode(this.outputDocument, template.nodeValue);\r\n // Set siblingPosition to preserve insertion order during serialization\r\n node.siblingPosition = output.childNodes.length;\r\n domAppendChild(output, node);\r\n }\r\n }\r\n\r\n /**\r\n * Passes template text to the output. The current template node does\r\n * not specify an XSL-T operation and therefore is appended to the\r\n * output with all its attributes. Then continues traversing the\r\n * template node tree.\r\n * @param context The Expression Context.\r\n * @param template The XSLT stylesheet or transformation.\r\n * @param output The output.\r\n */\r\n protected async xsltPassThrough(context: ExprContext, template: XNode, output: XNode) {\r\n switch (template.nodeType) {\r\n case DOM_TEXT_NODE:\r\n if (this.xsltPassText(template)) {\r\n this.commonLogicTextNode(context, template, output);\r\n }\r\n\r\n break;\r\n case DOM_ELEMENT_NODE:\r\n let node: XNode;\r\n let elementContext = context;\r\n // Don't change context based on input document structure\r\n // The context should remain as provided, unless explicitly changed by XSLT instructions\r\n node = context.nodeList[context.position];\r\n\r\n let newNode: XNode;\r\n newNode = domCreateElement(this.outputDocument, template.nodeName);\r\n newNode.siblingPosition = node.siblingPosition;\r\n\r\n domAppendChild(output || this.outputDocument, newNode);\r\n await this.xsltChildNodes(elementContext, template, newNode);\r\n\r\n const templateAttributes = template.childNodes.filter((a: XNode) => a?.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (const attribute of templateAttributes) {\r\n const name = attribute.nodeName;\r\n const value = this.xsltAttributeValue(attribute.nodeValue, elementContext);\r\n domSetAttribute(newNode, name, value);\r\n }\r\n\r\n break;\r\n default:\r\n // This applies also to the DOCUMENT_NODE of the XSL stylesheet,\r\n // so we don't have to treat it specially.\r\n await this.xsltChildNodes(context, template, output);\r\n }\r\n }\r\n\r\n /**\r\n * Determines if a text node in the XSLT template document is to be\r\n * stripped according to XSLT whitespace stripping rules.\r\n * @see [XSLT], section 3.4.\r\n * @param template The XSLT template.\r\n * @returns TODO\r\n * @todo Whitespace stripping on the input document is\r\n * currently not implemented.\r\n */\r\n protected xsltPassText(template: XNode) {\r\n if (!template.nodeValue.match(/^\\s*$/)) {\r\n return true;\r\n }\r\n\r\n let element = template.parentNode;\r\n if (this.isXsltElement(element, 'text')) {\r\n return true;\r\n }\r\n\r\n while (element && element.nodeType == DOM_ELEMENT_NODE) {\r\n const xmlspace = domGetAttributeValue(element, 'xml:space');\r\n if (xmlspace) {\r\n if (xmlspace == 'default') {\r\n return false;\r\n }\r\n\r\n if (xmlspace == 'preserve') {\r\n return true;\r\n }\r\n }\r\n\r\n element = element.parentNode;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n protected findAttributeInContext(attributeName: string, context: ExprContext): XNode {\r\n return context.nodeList[context.position].childNodes.find(\r\n (a: XNode) => a.nodeType === DOM_ATTRIBUTE_NODE && a.nodeName === attributeName\r\n );\r\n }\r\n\r\n /**\r\n * Evaluates an XSL-T attribute value template. Attribute value\r\n * templates are attributes on XSL-T elements that contain XPath\r\n * expressions in braces {}. The XSL-T expressions are evaluated in\r\n * the current input context.\r\n * @param value TODO\r\n * @param context TODO\r\n * @returns TODO\r\n */\r\n protected xsltAttributeValue(value: any, context: ExprContext) {\r\n const parts = value.split('{');\r\n if (parts.length === 1) {\r\n return value;\r\n }\r\n\r\n let ret = '';\r\n for (let i = 0; i < parts.length; ++i) {\r\n const rp = parts[i].split('}');\r\n if (rp.length != 2) {\r\n // first literal part of the value\r\n ret += parts[i];\r\n continue;\r\n }\r\n\r\n const val = this.xPath.xPathEval(rp[0], context).stringValue();\r\n ret += val + rp[1];\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Evaluates an XPath expression in the current input context as a\r\n * match.\r\n * @see [XSLT] section 5.2, paragraph 1\r\n * @param match TODO\r\n * @param context The Expression Context.\r\n * @param axis The XPath axis. Used when the match does not start with the parent.\r\n * @returns {XNode[]} A list of the found nodes.\r\n */\r\n protected xsltMatch(match: string, context: ExprContext, axis?: string): XNode[] {\r\n const expression = this.xPath.xPathParse(match, axis);\r\n return this.matchResolver.expressionMatch(expression, context);\r\n }\r\n\r\n /**\r\n * Sets parameters defined by xsl:with-param child nodes of the\r\n * current template node, in the current input context. This happens\r\n * before the operation specified by the current template node is\r\n * executed.\r\n * @param context The Expression Context.\r\n * @param template The template node.\r\n */\r\n protected async xsltWithParam(context: ExprContext, template: XNode) {\r\n for (const childNode of template.childNodes) {\r\n if (childNode.nodeType === DOM_ELEMENT_NODE && this.isXsltElement(childNode, 'with-param')) {\r\n await this.xsltVariable(context, childNode, true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Test if the given element is an XSLT element, optionally the one with the given name.\r\n * @param {XNode} element The element.\r\n * @param {string} opt_wantedName The name for comparison.\r\n * @returns True, if element is an XSL node. False otherwise.\r\n */\r\n protected isXsltElement(element: XNode, opt_wantedName?: string) {\r\n if (opt_wantedName && element.localName != opt_wantedName) return false;\r\n if (element.namespaceUri) return element.namespaceUri === 'http://www.w3.org/1999/XSL/Transform';\r\n return element.prefix === 'xsl'; // backwards compatibility with earlier versions of xslt-processor\r\n }\r\n}\r\n"],"mappings":"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","names":["he","he","i","node"]}
1
+ {"version":3,"sources":["../src/xpath/lib/src/lexer/token.ts","../src/xpath/lib/src/lexer/lexer.ts","../src/xpath/lib/src/expressions/expression.ts","../src/xpath/lib/src/expressions/literal-expression.ts","../src/xpath/lib/src/expressions/variable-reference-expression.ts","../src/xpath/lib/src/expressions/unary-expression.ts","../src/xpath/lib/src/expressions/binary-expression.ts","../src/xpath/lib/src/expressions/arithmetic-expression.ts","../src/xpath/lib/src/expressions/logical-expression.ts","../src/xpath/lib/src/expressions/step-expression.ts","../src/xpath/lib/src/expressions/predicate-expression.ts","../src/xpath/lib/src/expressions/location-path-expression.ts","../src/xpath/lib/src/expressions/filter-expression.ts","../src/xpath/lib/src/expressions/union-expression.ts","../src/xpath/lib/src/expressions/function-call-expression.ts","../src/xpath/lib/src/parser.ts","../src/xpath/lib/src/context.ts","../src/xpath/values/string-value.ts","../src/xpath/values/number-value.ts","../src/xpath/values/boolean-value.ts","../src/dom/functions.ts","../src/constants.ts","../src/dom/xnode.ts","../src/dom/xdocument.ts","../src/dom/xml-functions.ts","../src/dom/xml-parser.ts","../src/dom/xmltoken.ts","../src/xpath/values/node-set-value.ts","../src/xpath/xpath.ts","../src/xpath/tokens.ts","../src/xpath/expr-context.ts","../src/xpath/match-resolver.ts","../src/xpath/node-tests/node-test-any.ts","../src/xpath/node-tests/node-test-comment.ts","../src/xpath/node-tests/node-test-element-or-attribute.ts","../src/xpath/node-tests/node-test-name.ts","../src/xpath/node-tests/node-test-nc.ts","../src/xpath/node-tests/node-test-pi.ts","../src/xpath/node-tests/node-test-text.ts","../src/xslt/functions.ts","../src/xslt/xslt.ts"],"sourcesContent":["import { TokenType as XPathTokenType } from \"./token-type\";\r\n\r\nexport class XPathToken {\r\n type: XPathTokenType;\r\n lexeme: string;\r\n\r\n constructor(type: XPathTokenType, lexeme: string) {\r\n this.type = type;\r\n this.lexeme = lexeme;\r\n }\r\n}\r\n","import { XPathToken } from \"./token\";\r\n\r\nconst RESERVED_WORDS = {\r\n // Location axes (XPath 1.0 complete list)\r\n \"ancestor\": { type: \"LOCATION\", value: \"ancestor\" },\r\n \"ancestor-or-self\": { type: \"LOCATION\", value: \"ancestor-or-self\" },\r\n \"attribute\": { type: \"LOCATION\", value: \"attribute\" },\r\n \"child\": { type: \"LOCATION\", value: \"child\" },\r\n \"descendant\": { type: \"LOCATION\", value: \"descendant\" },\r\n \"descendant-or-self\": { type: \"LOCATION\", value: \"descendant-or-self\" },\r\n \"following\": { type: \"LOCATION\", value: \"following\" },\r\n \"following-sibling\": { type: \"LOCATION\", value: \"following-sibling\" },\r\n \"namespace\": { type: \"LOCATION\", value: \"namespace\" },\r\n \"parent\": { type: \"LOCATION\", value: \"parent\" },\r\n \"preceding\": { type: \"LOCATION\", value: \"preceding\" },\r\n \"preceding-sibling\": { type: \"LOCATION\", value: \"preceding-sibling\" },\r\n \"self\": { type: \"LOCATION\", value: \"self\" },\r\n\r\n // Node type tests\r\n \"node\": { type: \"NODE_TYPE\", value: \"node\" },\r\n \"text\": { type: \"NODE_TYPE\", value: \"text\" },\r\n \"comment\": { type: \"NODE_TYPE\", value: \"comment\" },\r\n \"processing-instruction\": { type: \"NODE_TYPE\", value: \"processing-instruction\" },\r\n\r\n // Operators\r\n \"and\": { type: \"OPERATOR\", value: \"and\" },\r\n \"or\": { type: \"OPERATOR\", value: \"or\" },\r\n \"div\": { type: \"OPERATOR\", value: \"div\" },\r\n \"mod\": { type: \"OPERATOR\", value: \"mod\" },\r\n\r\n // Node set functions\r\n \"last\": { type: \"FUNCTION\", value: \"last\" },\r\n \"position\": { type: \"FUNCTION\", value: \"position\" },\r\n \"count\": { type: \"FUNCTION\", value: \"count\" },\r\n \"id\": { type: \"FUNCTION\", value: \"id\" },\r\n \"local-name\": { type: \"FUNCTION\", value: \"local-name\" },\r\n \"namespace-uri\": { type: \"FUNCTION\", value: \"namespace-uri\" },\r\n \"name\": { type: \"FUNCTION\", value: \"name\" },\r\n\r\n // String functions\r\n \"string\": { type: \"FUNCTION\", value: \"string\" },\r\n \"concat\": { type: \"FUNCTION\", value: \"concat\" },\r\n \"starts-with\": { type: \"FUNCTION\", value: \"starts-with\" },\r\n \"contains\": { type: \"FUNCTION\", value: \"contains\" },\r\n \"substring-before\": { type: \"FUNCTION\", value: \"substring-before\" },\r\n \"substring-after\": { type: \"FUNCTION\", value: \"substring-after\" },\r\n \"substring\": { type: \"FUNCTION\", value: \"substring\" },\r\n \"string-length\": { type: \"FUNCTION\", value: \"string-length\" },\r\n \"normalize-space\": { type: \"FUNCTION\", value: \"normalize-space\" },\r\n \"translate\": { type: \"FUNCTION\", value: \"translate\" },\r\n\r\n // Boolean functions\r\n \"boolean\": { type: \"FUNCTION\", value: \"boolean\" },\r\n \"not\": { type: \"FUNCTION\", value: \"not\" },\r\n \"true\": { type: \"FUNCTION\", value: \"true\" },\r\n \"false\": { type: \"FUNCTION\", value: \"false\" },\r\n \"lang\": { type: \"FUNCTION\", value: \"lang\" },\r\n\r\n // Number functions\r\n \"number\": { type: \"FUNCTION\", value: \"number\" },\r\n \"sum\": { type: \"FUNCTION\", value: \"sum\" },\r\n \"floor\": { type: \"FUNCTION\", value: \"floor\" },\r\n \"ceiling\": { type: \"FUNCTION\", value: \"ceiling\" },\r\n \"round\": { type: \"FUNCTION\", value: \"round\" },\r\n\r\n // XSLT-specific functions (commonly used)\r\n \"document\": { type: \"FUNCTION\", value: \"document\" },\r\n \"key\": { type: \"FUNCTION\", value: \"key\" },\r\n \"format-number\": { type: \"FUNCTION\", value: \"format-number\" },\r\n \"current\": { type: \"FUNCTION\", value: \"current\" },\r\n \"unparsed-entity-uri\": { type: \"FUNCTION\", value: \"unparsed-entity-uri\" },\r\n \"generate-id\": { type: \"FUNCTION\", value: \"generate-id\" },\r\n \"system-property\": { type: \"FUNCTION\", value: \"system-property\" },\r\n \"element-available\": { type: \"FUNCTION\", value: \"element-available\" },\r\n \"function-available\": { type: \"FUNCTION\", value: \"function-available\" },\r\n};\r\n\r\nexport class XPathLexer {\r\n expression: string;\r\n current: number;\r\n tokens: XPathToken[];\r\n\r\n /**\r\n * Check if character is a valid start of an identifier.\r\n * Supports Unicode letters according to XML NCName specification.\r\n */\r\n isAlpha(char: string): boolean {\r\n // Allow ASCII letters, underscore, and Unicode letters\r\n // Using Unicode property escapes for broader Unicode support\r\n return /^[a-zA-Z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]$/.test(char);\r\n }\r\n\r\n /**\r\n * Check if character is valid in an identifier (after the first character).\r\n * Supports Unicode letters and digits according to XML NCName specification.\r\n * Note: Hyphen is handled separately in parseIdentifier for reserved words.\r\n */\r\n isAlphaNumeric(char: string): boolean {\r\n // Allow ASCII alphanumerics, underscore, and Unicode letters/digits/combining chars\r\n return /^[a-zA-Z0-9_\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0300-\\u036F\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]$/.test(char);\r\n }\r\n\r\n isNumber(char: string): boolean {\r\n return /^[0-9]$/.test(char);\r\n }\r\n\r\n isWhitespace(char: string): boolean {\r\n return /^[\\s\\t\\n\\r]$/.test(char);\r\n }\r\n\r\n peek(): string | undefined {\r\n return this.expression[this.current];\r\n }\r\n\r\n peekNext(): string | undefined {\r\n return this.expression[this.current + 1];\r\n }\r\n\r\n next(): string {\r\n return this.expression[this.current++];\r\n }\r\n\r\n match(expected: string): boolean {\r\n if (this.current >= this.expression.length) return false;\r\n if (this.expression[this.current] !== expected) return false;\r\n this.current++;\r\n return true;\r\n }\r\n\r\n parseIdentifier(firstCharacter: string): XPathToken {\r\n let characters = firstCharacter;\r\n\r\n // Parse alphanumeric characters, allowing hyphens for element names\r\n // XML NCName allows hyphens (but not at the start)\r\n while (this.current < this.expression.length) {\r\n const char = this.expression[this.current];\r\n\r\n if (this.isAlphaNumeric(char)) {\r\n characters += this.next();\r\n } else if (char === \"-\") {\r\n // Look ahead to check if this is a hyphenated identifier or subtraction\r\n const nextChar = this.expression[this.current + 1];\r\n\r\n // If hyphen is immediately followed by an alphanumeric character,\r\n // it's likely part of the identifier (e.g., \"my-element\", \"ancestor-or-self\")\r\n if (nextChar && this.isAlphaNumeric(nextChar)) {\r\n this.current++; // consume the hyphen\r\n characters += \"-\";\r\n // Continue parsing the rest of the identifier\r\n while (this.current < this.expression.length && this.isAlphaNumeric(this.expression[this.current])) {\r\n characters += this.next();\r\n }\r\n } else {\r\n // Hyphen followed by space or operator - it's subtraction\r\n break;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n const likelyReservedWord = RESERVED_WORDS[characters.toLowerCase()];\r\n if (likelyReservedWord) {\r\n return new XPathToken(likelyReservedWord.type, characters);\r\n }\r\n\r\n if (characters.length > 0) {\r\n return new XPathToken(\"IDENTIFIER\", characters);\r\n }\r\n\r\n throw new Error(`Invalid identifier: ${characters}`);\r\n }\r\n\r\n parseString(quoteChar: string): XPathToken {\r\n let value = \"\";\r\n\r\n while (this.current < this.expression.length && this.expression[this.current] !== quoteChar) {\r\n value += this.next();\r\n }\r\n\r\n if (this.current >= this.expression.length) {\r\n throw new Error(`Unterminated string literal`);\r\n }\r\n\r\n this.next(); // consume closing quote\r\n return new XPathToken(\"STRING\", value);\r\n }\r\n\r\n parseNumber(firstCharacter: string): XPathToken {\r\n let characters = firstCharacter;\r\n\r\n while (\r\n this.current < this.expression.length &&\r\n this.isNumber(this.expression[this.current]) &&\r\n this.expression[this.current] !== \".\"\r\n ) {\r\n characters += this.next();\r\n }\r\n\r\n // Allow for a decimal point in the number\r\n if (this.current < this.expression.length && this.expression[this.current] === \".\") {\r\n characters += this.next();\r\n while (\r\n this.current < this.expression.length &&\r\n this.isNumber(this.expression[this.current])\r\n ) {\r\n characters += this.next();\r\n }\r\n }\r\n\r\n if (characters.length > 0) {\r\n return new XPathToken(\"NUMBER\", characters);\r\n }\r\n\r\n // If no valid number was found, return an error token\r\n throw new Error(`Invalid number: ${characters}`);\r\n }\r\n\r\n scanToken(): XPathToken | null {\r\n const char = this.next();\r\n\r\n // Skip whitespace\r\n if (this.isWhitespace(char)) {\r\n return null;\r\n }\r\n\r\n switch (char) {\r\n case \"@\":\r\n return new XPathToken(\"AT\", char);\r\n case \"$\":\r\n return new XPathToken(\"DOLLAR\", char);\r\n case \"|\":\r\n return new XPathToken(\"PIPE\", char);\r\n case \"{\":\r\n return new XPathToken(\"OPEN_CURLY_BRACKET\", char);\r\n case \"}\":\r\n return new XPathToken(\"CLOSE_CURLY_BRACKET\", char);\r\n case \"[\":\r\n return new XPathToken(\"OPEN_SQUARE_BRACKET\", char);\r\n case \"]\":\r\n return new XPathToken(\"CLOSE_SQUARE_BRACKET\", char);\r\n case \"(\":\r\n return new XPathToken(\"OPEN_PAREN\", char);\r\n case \")\":\r\n return new XPathToken(\"CLOSE_PAREN\", char);\r\n case \"+\":\r\n return new XPathToken(\"PLUS\", char);\r\n case \"-\":\r\n return new XPathToken(\"MINUS\", char);\r\n case \"*\":\r\n return new XPathToken(\"ASTERISK\", char);\r\n case \",\":\r\n return new XPathToken(\"COMMA\", char);\r\n\r\n // Tokens that may be single or double character\r\n case \".\":\r\n if (this.match(\".\")) {\r\n return new XPathToken(\"DOT_DOT\", \"..\");\r\n }\r\n // Check if it's a number starting with decimal point\r\n if (this.peek() && this.isNumber(this.peek()!)) {\r\n return this.parseNumber(char);\r\n }\r\n return new XPathToken(\"DOT\", char);\r\n\r\n case \"/\":\r\n if (this.match(\"/\")) {\r\n return new XPathToken(\"DOUBLE_SLASH\", \"//\");\r\n }\r\n return new XPathToken(\"SLASH\", char);\r\n\r\n case \":\":\r\n if (this.match(\":\")) {\r\n return new XPathToken(\"COLON_COLON\", \"::\");\r\n }\r\n return new XPathToken(\"COLON\", char);\r\n\r\n case \"=\":\r\n return new XPathToken(\"EQUALS\", char);\r\n\r\n case \"!\":\r\n if (this.match(\"=\")) {\r\n return new XPathToken(\"NOT_EQUALS\", \"!=\");\r\n }\r\n throw new Error(`Unexpected character: ${char}`);\r\n\r\n case \"<\":\r\n if (this.match(\"=\")) {\r\n return new XPathToken(\"LESS_THAN_OR_EQUAL\", \"<=\");\r\n }\r\n return new XPathToken(\"LESS_THAN\", char);\r\n\r\n case \">\":\r\n if (this.match(\"=\")) {\r\n return new XPathToken(\"GREATER_THAN_OR_EQUAL\", \">=\");\r\n }\r\n return new XPathToken(\"GREATER_THAN\", char);\r\n\r\n // String literals\r\n case \"'\":\r\n return this.parseString(\"'\");\r\n\r\n case '\"':\r\n return this.parseString('\"');\r\n\r\n default:\r\n if (this.isNumber(char)) {\r\n return this.parseNumber(char);\r\n }\r\n\r\n if (this.isAlpha(char)) {\r\n return this.parseIdentifier(char);\r\n }\r\n\r\n throw new Error(`Unexpected character: ${char}`);\r\n }\r\n }\r\n\r\n scan(expression: string): XPathToken[] {\r\n this.expression = expression;\r\n this.tokens = [];\r\n this.current = 0;\r\n\r\n while (this.current < this.expression.length) {\r\n const token = this.scanToken();\r\n if (token !== null) {\r\n this.tokens.push(token);\r\n }\r\n }\r\n\r\n return this.tokens;\r\n }\r\n}\r\n","import { XPathContext, XPathResult } from '../context';\r\n\r\nexport abstract class XPathExpression {\r\n abstract evaluate(context: XPathContext): XPathResult;\r\n}\r\n","import { XPathContext } from '../context';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport class XPathStringLiteral extends XPathExpression {\r\n value: string;\r\n\r\n constructor(value: string) {\r\n super();\r\n this.value = value;\r\n }\r\n\r\n evaluate(_context: XPathContext): string {\r\n return this.value;\r\n }\r\n}\r\n\r\nexport class XPathNumberLiteral extends XPathExpression {\r\n value: number;\r\n\r\n constructor(value: number) {\r\n super();\r\n this.value = value;\r\n }\r\n\r\n evaluate(_context: XPathContext): number {\r\n return this.value;\r\n }\r\n}\r\n","import { XPathContext, XPathResult } from '../context';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport class XPathVariableReference extends XPathExpression {\r\n name: string;\r\n\r\n constructor(name: string) {\r\n super();\r\n this.name = name;\r\n }\r\n\r\n evaluate(context: XPathContext): XPathResult {\r\n if (!context.variables) {\r\n throw new Error(`Variable $${this.name} is not defined`);\r\n }\r\n\r\n if (!(this.name in context.variables)) {\r\n throw new Error(`Variable $${this.name} is not defined`);\r\n }\r\n\r\n return context.variables[this.name];\r\n }\r\n}\r\n","import { XPathContext } from '../context';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport class XPathUnaryExpression extends XPathExpression {\r\n operator: string;\r\n operand: XPathExpression;\r\n\r\n constructor(operator: string, operand: XPathExpression) {\r\n super();\r\n this.operator = operator;\r\n this.operand = operand;\r\n }\r\n\r\n evaluate(context: XPathContext): number {\r\n const value = this.operand.evaluate(context);\r\n\r\n switch (this.operator) {\r\n case '-':\r\n return -Number(value);\r\n default:\r\n throw new Error(`Unknown unary operator: ${this.operator}`);\r\n }\r\n }\r\n}\r\n","import { XPathContext } from '../context';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport class XPathBinaryExpression extends XPathExpression {\r\n left: XPathExpression;\r\n right: XPathExpression;\r\n operator: string;\r\n\r\n constructor(left: XPathExpression, right: XPathExpression, operator: string) {\r\n super();\r\n this.left = left;\r\n this.right = right;\r\n this.operator = operator;\r\n }\r\n\r\n evaluate(context: XPathContext): boolean {\r\n const leftValue = this.left.evaluate(context);\r\n const rightValue = this.right.evaluate(context);\r\n\r\n return this.compare(leftValue, rightValue, this.operator);\r\n }\r\n\r\n /**\r\n * XPath comparison rules:\r\n * - If both are node-sets: compare each node in left with each node in right\r\n * - If one is node-set and other is string: convert node-set to strings and compare\r\n * - If one is node-set and other is number: convert node-set to numbers and compare\r\n * - If one is node-set and other is boolean: convert node-set to boolean and compare\r\n * - Otherwise, convert both to numbers for numeric comparison, or strings for equality\r\n */\r\n private compare(left: any, right: any, operator: string): boolean {\r\n const leftIsNodeSet = Array.isArray(left);\r\n const rightIsNodeSet = Array.isArray(right);\r\n\r\n // Both are node-sets\r\n if (leftIsNodeSet && rightIsNodeSet) {\r\n return this.compareNodeSets(left, right, operator);\r\n }\r\n\r\n // Left is node-set\r\n if (leftIsNodeSet) {\r\n return this.compareNodeSetToValue(left, right, operator);\r\n }\r\n\r\n // Right is node-set\r\n if (rightIsNodeSet) {\r\n return this.compareValueToNodeSet(left, right, operator);\r\n }\r\n\r\n // Neither is a node-set\r\n return this.comparePrimitives(left, right, operator);\r\n }\r\n\r\n private compareNodeSets(left: any[], right: any[], operator: string): boolean {\r\n // For each node in left, compare with each node in right\r\n for (const leftNode of left) {\r\n const leftStr = this.getStringValue(leftNode);\r\n for (const rightNode of right) {\r\n const rightStr = this.getStringValue(rightNode);\r\n if (this.comparePrimitives(leftStr, rightStr, operator)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private compareNodeSetToValue(nodeSet: any[], value: any, operator: string): boolean {\r\n // Compare each node in the set to the value\r\n for (const node of nodeSet) {\r\n const nodeValue = typeof value === 'number'\r\n ? Number(this.getStringValue(node))\r\n : this.getStringValue(node);\r\n if (this.comparePrimitives(nodeValue, value, operator)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private compareValueToNodeSet(value: any, nodeSet: any[], operator: string): boolean {\r\n // Compare value to each node in the set\r\n for (const node of nodeSet) {\r\n const nodeValue = typeof value === 'number'\r\n ? Number(this.getStringValue(node))\r\n : this.getStringValue(node);\r\n if (this.comparePrimitives(value, nodeValue, operator)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private comparePrimitives(left: any, right: any, operator: string): boolean {\r\n // For equality operators, compare as-is (after node-set conversion)\r\n // For relational operators, convert to numbers\r\n switch (operator) {\r\n case '=':\r\n return left == right; // Use loose equality for type coercion\r\n case '!=':\r\n return left != right;\r\n case '<':\r\n return Number(left) < Number(right);\r\n case '>':\r\n return Number(left) > Number(right);\r\n case '<=':\r\n return Number(left) <= Number(right);\r\n case '>=':\r\n return Number(left) >= Number(right);\r\n default:\r\n throw new Error(`Unknown operator: ${operator}`);\r\n }\r\n }\r\n\r\n private getStringValue(node: any): string {\r\n if (!node) return '';\r\n\r\n // Text node or attribute\r\n if (node.nodeType === 3 || node.nodeType === 2) {\r\n return node.nodeValue || node.textContent || '';\r\n }\r\n\r\n // Element node - get text content\r\n if (node.textContent !== undefined) {\r\n return node.textContent;\r\n }\r\n\r\n // Fallback: recursively get text content\r\n if (node.childNodes) {\r\n let text = '';\r\n for (const child of Array.from(node.childNodes as ArrayLike<any>)) {\r\n if (child.nodeType === 3) {\r\n text += child.nodeValue || '';\r\n } else if (child.nodeType === 1) {\r\n text += this.getStringValue(child);\r\n }\r\n }\r\n return text;\r\n }\r\n\r\n return String(node);\r\n }\r\n}","import { XPathContext } from '../context';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport type ArithmeticOperator = '+' | '-' | '*' | 'div' | 'mod';\r\n\r\nexport class XPathArithmeticExpression extends XPathExpression {\r\n left: XPathExpression;\r\n right: XPathExpression;\r\n operator: ArithmeticOperator;\r\n\r\n constructor(left: XPathExpression, right: XPathExpression, operator: ArithmeticOperator) {\r\n super();\r\n this.left = left;\r\n this.right = right;\r\n this.operator = operator;\r\n }\r\n\r\n evaluate(context: XPathContext): number {\r\n const leftValue = Number(this.left.evaluate(context));\r\n const rightValue = Number(this.right.evaluate(context));\r\n\r\n switch (this.operator) {\r\n case '+':\r\n return leftValue + rightValue;\r\n case '-':\r\n return leftValue - rightValue;\r\n case '*':\r\n return leftValue * rightValue;\r\n case 'div':\r\n return leftValue / rightValue;\r\n case 'mod':\r\n return leftValue % rightValue;\r\n default:\r\n throw new Error(`Unknown arithmetic operator: ${this.operator}`);\r\n }\r\n }\r\n}\r\n","import { XPathContext, XPathResult } from '../context';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport class XPathLogicalExpression extends XPathExpression {\r\n left: XPathExpression;\r\n right: XPathExpression;\r\n operator: 'and' | 'or';\r\n\r\n constructor(left: XPathExpression, right: XPathExpression, operator: 'and' | 'or') {\r\n super();\r\n this.left = left;\r\n this.right = right;\r\n this.operator = operator;\r\n }\r\n\r\n private toBoolean(value: XPathResult): boolean {\r\n if (typeof value === 'boolean') {\r\n return value;\r\n }\r\n if (typeof value === 'number') {\r\n return value !== 0 && !isNaN(value);\r\n }\r\n if (typeof value === 'string') {\r\n return value.length > 0;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.length > 0;\r\n }\r\n return !!value;\r\n }\r\n\r\n evaluate(context: XPathContext): boolean {\r\n const leftValue = this.toBoolean(this.left.evaluate(context));\r\n\r\n // Short-circuit evaluation\r\n if (this.operator === 'and') {\r\n if (!leftValue) return false;\r\n return this.toBoolean(this.right.evaluate(context));\r\n }\r\n\r\n if (this.operator === 'or') {\r\n if (leftValue) return true;\r\n return this.toBoolean(this.right.evaluate(context));\r\n }\r\n\r\n throw new Error(`Unknown logical operator: ${this.operator}`);\r\n }\r\n}\r\n","import { XPathExpression } from './expression';\r\n\r\nexport type AxisType =\r\n | 'ancestor'\r\n | 'ancestor-or-self'\r\n | 'attribute'\r\n | 'child'\r\n | 'descendant'\r\n | 'descendant-or-self'\r\n | 'following'\r\n | 'following-sibling'\r\n | 'namespace'\r\n | 'parent'\r\n | 'preceding'\r\n | 'preceding-sibling'\r\n | 'self'\r\n | 'self-and-siblings'; // Custom axis for XSLT template matching\r\n\r\nexport interface NodeTest {\r\n type: 'name' | 'node-type' | 'wildcard' | 'processing-instruction';\r\n name?: string;\r\n nodeType?: 'node' | 'text' | 'comment' | 'processing-instruction';\r\n}\r\n\r\nexport class XPathStep extends XPathExpression {\r\n axis: AxisType;\r\n nodeTest: NodeTest;\r\n predicates: XPathExpression[];\r\n\r\n constructor(axis: AxisType, nodeTest: NodeTest, predicates: XPathExpression[] = []) {\r\n super();\r\n this.axis = axis;\r\n this.nodeTest = nodeTest;\r\n this.predicates = predicates;\r\n }\r\n\r\n evaluate(context: any): any[] {\r\n const node = context?.node;\r\n if (!node) return [];\r\n\r\n // Get candidate nodes based on axis\r\n let candidates = this.getNodesByAxis(node, context);\r\n\r\n // Filter by node test (pass context for namespace resolution)\r\n candidates = candidates.filter(n => this.matchesNodeTest(n, context));\r\n\r\n // Apply predicates\r\n candidates = this.applyPredicates(candidates, context);\r\n\r\n return candidates;\r\n }\r\n\r\n private getNodesByAxis(node: any, context?: any): any[] {\r\n switch (this.axis) {\r\n case 'child':\r\n // Filter out attribute nodes (nodeType 2) from childNodes\r\n return this.getChildNodes(node);\r\n\r\n case 'parent':\r\n return node.parentNode ? [node.parentNode] : [];\r\n\r\n case 'self':\r\n return [node];\r\n\r\n case 'attribute':\r\n // Attributes can be in a separate 'attributes' property or mixed in childNodes\r\n if (node.attributes) {\r\n return Array.from(node.attributes);\r\n }\r\n // Fallback: filter childNodes for attribute nodes\r\n return Array.from(node.childNodes || []).filter((n: any) => n.nodeType === 2);\r\n\r\n case 'descendant':\r\n return this.getDescendants(node, false);\r\n\r\n case 'descendant-or-self':\r\n return this.getDescendants(node, true);\r\n\r\n case 'ancestor':\r\n return this.getAncestors(node, false);\r\n\r\n case 'ancestor-or-self':\r\n return this.getAncestors(node, true);\r\n\r\n case 'following-sibling':\r\n return this.getFollowingSiblings(node);\r\n\r\n case 'preceding-sibling':\r\n return this.getPrecedingSiblings(node);\r\n\r\n case 'following':\r\n return this.getFollowing(node);\r\n\r\n case 'preceding':\r\n return this.getPreceding(node);\r\n\r\n case 'namespace':\r\n // Namespace axis is rarely used and implementation-specific\r\n return [];\r\n\r\n case 'self-and-siblings':\r\n // Custom axis for XSLT template matching\r\n // Returns all nodes in the context's nodeList (excluding attributes)\r\n if (context?.nodeList) {\r\n return context.nodeList.filter((n: any) => n.nodeType !== 2);\r\n }\r\n // Fallback: just return self\r\n return [node];\r\n\r\n default:\r\n return [];\r\n }\r\n }\r\n\r\n /**\r\n * Get child nodes excluding attribute nodes.\r\n * XNode stores attributes in childNodes, but XPath child axis doesn't include them.\r\n */\r\n private getChildNodes(node: any): any[] {\r\n const children = Array.from(node.childNodes || []);\r\n // Filter out attribute nodes (nodeType 2)\r\n return children.filter((n: any) => n.nodeType !== 2);\r\n }\r\n\r\n private getDescendants(node: any, includeSelf: boolean): any[] {\r\n const result: any[] = [];\r\n if (includeSelf) result.push(node);\r\n\r\n const walk = (n: any) => {\r\n // Use getChildNodes to exclude attribute nodes\r\n for (const child of this.getChildNodes(n)) {\r\n result.push(child);\r\n walk(child);\r\n }\r\n };\r\n walk(node);\r\n return result;\r\n }\r\n\r\n private getAncestors(node: any, includeSelf: boolean): any[] {\r\n const result: any[] = [];\r\n if (includeSelf) result.push(node);\r\n\r\n let current = node.parentNode;\r\n while (current) {\r\n result.push(current);\r\n current = current.parentNode;\r\n }\r\n return result;\r\n }\r\n\r\n private getFollowingSiblings(node: any): any[] {\r\n const result: any[] = [];\r\n let sibling = node.nextSibling;\r\n while (sibling) {\r\n result.push(sibling);\r\n sibling = sibling.nextSibling;\r\n }\r\n return result;\r\n }\r\n\r\n private getPrecedingSiblings(node: any): any[] {\r\n const result: any[] = [];\r\n let sibling = node.previousSibling;\r\n while (sibling) {\r\n result.unshift(sibling);\r\n sibling = sibling.previousSibling;\r\n }\r\n return result;\r\n }\r\n\r\n private getFollowing(node: any): any[] {\r\n const result: any[] = [];\r\n\r\n // First, following siblings and their descendants\r\n let sibling = node.nextSibling;\r\n while (sibling) {\r\n result.push(sibling);\r\n result.push(...this.getDescendants(sibling, false));\r\n sibling = sibling.nextSibling;\r\n }\r\n\r\n // Then ancestors' following siblings\r\n let ancestor = node.parentNode;\r\n while (ancestor) {\r\n sibling = ancestor.nextSibling;\r\n while (sibling) {\r\n result.push(sibling);\r\n result.push(...this.getDescendants(sibling, false));\r\n sibling = sibling.nextSibling;\r\n }\r\n ancestor = ancestor.parentNode;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private getPreceding(node: any): any[] {\r\n const result: any[] = [];\r\n\r\n // Preceding siblings and their descendants (in reverse document order)\r\n let sibling = node.previousSibling;\r\n while (sibling) {\r\n result.unshift(sibling);\r\n const descendants = this.getDescendants(sibling, false);\r\n result.unshift(...descendants);\r\n sibling = sibling.previousSibling;\r\n }\r\n\r\n // Ancestors' preceding siblings\r\n let ancestor = node.parentNode;\r\n while (ancestor) {\r\n sibling = ancestor.previousSibling;\r\n while (sibling) {\r\n result.unshift(sibling);\r\n const descendants = this.getDescendants(sibling, false);\r\n result.unshift(...descendants);\r\n sibling = sibling.previousSibling;\r\n }\r\n ancestor = ancestor.parentNode;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private matchesNodeTest(node: any, context?: any): boolean {\r\n const nodeType = node.nodeType;\r\n\r\n switch (this.nodeTest.type) {\r\n case 'wildcard':\r\n // Check if it's a namespaced wildcard like \"ns:*\"\r\n if (this.nodeTest.name && this.nodeTest.name.endsWith(':*')) {\r\n const prefix = this.nodeTest.name.slice(0, -2);\r\n const nsUri = context?.namespaces?.[prefix];\r\n if (!nsUri) return false; // Unknown prefix - no match\r\n\r\n const nodeNsUri = node.namespaceURI || node.namespaceUri || '';\r\n return (nodeType === 1 || nodeType === 2) && nodeNsUri === nsUri;\r\n }\r\n // Regular wildcard - matches any element (nodeType 1) or attribute (nodeType 2)\r\n return nodeType === 1 || nodeType === 2;\r\n\r\n case 'name':\r\n // Match element or attribute by name\r\n if (nodeType !== 1 && nodeType !== 2) return false;\r\n\r\n const testName = this.nodeTest.name!;\r\n const colonIndex = testName.indexOf(':');\r\n\r\n if (colonIndex > 0) {\r\n // Prefixed name like \"xhtml:root\" or \"atom:title\"\r\n const prefix = testName.substring(0, colonIndex);\r\n const localName = testName.substring(colonIndex + 1);\r\n const nsUri = context?.namespaces?.[prefix];\r\n\r\n if (!nsUri) {\r\n // Unknown prefix - no match\r\n return false;\r\n }\r\n\r\n // Match both local name AND namespace URI\r\n const nodeLocalName = node.localName || node.nodeName;\r\n const nodeNsUri = node.namespaceURI || node.namespaceUri || '';\r\n\r\n return nodeLocalName === localName && nodeNsUri === nsUri;\r\n }\r\n\r\n // Unprefixed name - match by local name only\r\n const nodeName = node.localName || node.nodeName;\r\n return nodeName === testName;\r\n\r\n case 'node-type':\r\n switch (this.nodeTest.nodeType) {\r\n case 'node':\r\n return true; // matches any node\r\n case 'text':\r\n return nodeType === 3; // text node\r\n case 'comment':\r\n return nodeType === 8; // comment node\r\n case 'processing-instruction':\r\n return nodeType === 7; // processing instruction\r\n default:\r\n return false;\r\n }\r\n\r\n case 'processing-instruction':\r\n if (nodeType !== 7) return false;\r\n if (this.nodeTest.name) {\r\n return node.target === this.nodeTest.name;\r\n }\r\n return true;\r\n\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private applyPredicates(nodes: any[], context: any): any[] {\r\n let result = nodes;\r\n\r\n for (const predicate of this.predicates) {\r\n const filtered: any[] = [];\r\n const size = result.length;\r\n\r\n for (let i = 0; i < result.length; i++) {\r\n const predicateContext = {\r\n ...context,\r\n node: result[i],\r\n position: i + 1,\r\n size: size,\r\n };\r\n\r\n const predicateResult = predicate.evaluate(predicateContext);\r\n\r\n // If predicate result is a number, it's a position test\r\n if (typeof predicateResult === 'number') {\r\n if (predicateResult === i + 1) {\r\n filtered.push(result[i]);\r\n }\r\n } else if (this.toBoolean(predicateResult)) {\r\n filtered.push(result[i]);\r\n }\r\n }\r\n\r\n result = filtered;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private toBoolean(value: any): boolean {\r\n if (typeof value === 'boolean') return value;\r\n if (typeof value === 'number') return value !== 0 && !isNaN(value);\r\n if (typeof value === 'string') return value.length > 0;\r\n if (Array.isArray(value)) return value.length > 0;\r\n return !!value;\r\n }\r\n}\r\n","import { XPathExpression } from './expression';\r\n\r\nexport class XPathPredicate extends XPathExpression {\r\n expression: XPathExpression;\r\n\r\n constructor(expression: XPathExpression) {\r\n super();\r\n this.expression = expression;\r\n }\r\n\r\n evaluate(context: any): any {\r\n return this.expression.evaluate(context);\r\n }\r\n\r\n test(context: any): boolean {\r\n const result = this.evaluate(context);\r\n\r\n // If the result is a number, compare with position\r\n if (typeof result === 'number') {\r\n return result === context?.position;\r\n }\r\n\r\n // Otherwise convert to boolean\r\n return this.toBoolean(result);\r\n }\r\n\r\n private toBoolean(value: any): boolean {\r\n if (typeof value === 'boolean') return value;\r\n if (typeof value === 'number') return value !== 0 && !isNaN(value);\r\n if (typeof value === 'string') return value.length > 0;\r\n if (Array.isArray(value)) return value.length > 0;\r\n return !!value;\r\n }\r\n}\r\n","import { XPathExpression } from './expression';\r\nimport { XPathStep } from './step-expression';\r\n\r\nexport class XPathLocationPath extends XPathExpression {\r\n steps: XPathStep[];\r\n absolute: boolean;\r\n\r\n constructor(steps: XPathStep[], absolute: boolean = false) {\r\n super();\r\n this.steps = steps;\r\n this.absolute = absolute;\r\n }\r\n\r\n evaluate(context: any): any[] {\r\n let nodes: any[];\r\n\r\n if (this.absolute) {\r\n // Start from document root\r\n const root = this.getDocumentRoot(context?.node);\r\n nodes = root ? [root] : [];\r\n } else {\r\n // Start from context node\r\n nodes = context?.node ? [context.node] : [];\r\n }\r\n\r\n // Apply each step\r\n for (const step of this.steps) {\r\n const nextNodes: any[] = [];\r\n\r\n for (const node of nodes) {\r\n const stepContext = { ...context, node };\r\n const result = step.evaluate(stepContext);\r\n nextNodes.push(...result);\r\n }\r\n\r\n // Remove duplicates while preserving document order\r\n nodes = this.uniqueNodes(nextNodes);\r\n }\r\n\r\n return nodes;\r\n }\r\n\r\n private getDocumentRoot(node: any): any {\r\n if (!node) return null;\r\n\r\n let root = node;\r\n while (root.parentNode) {\r\n root = root.parentNode;\r\n }\r\n\r\n // Return the document node itself (not the document element)\r\n // In XPath, \"/\" represents the document node, and \"/test\" selects\r\n // children of the document node named \"test\"\r\n return root;\r\n }\r\n\r\n private uniqueNodes(nodes: any[]): any[] {\r\n const seen = new Set();\r\n const result: any[] = [];\r\n\r\n for (const node of nodes) {\r\n if (!seen.has(node)) {\r\n seen.add(node);\r\n result.push(node);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { XPathExpression } from './expression';\r\n\r\nexport class XPathFilterExpression extends XPathExpression {\r\n expression: XPathExpression;\r\n predicate: XPathExpression;\r\n\r\n constructor(expression: XPathExpression, predicate: XPathExpression) {\r\n super();\r\n this.expression = expression;\r\n this.predicate = predicate;\r\n }\r\n\r\n evaluate(context: any): any[] {\r\n /* const result = this.expression.evaluate(context);\r\n return result.filter(item => this.predicate.evaluate(item)); */\r\n return [];\r\n }\r\n}\r\n","import { XPathExpression } from './expression';\r\n\r\nexport class XPathUnionExpression extends XPathExpression {\r\n left: XPathExpression;\r\n right: XPathExpression;\r\n\r\n constructor(left: XPathExpression, right: XPathExpression) {\r\n super();\r\n this.left = left;\r\n this.right = right;\r\n }\r\n\r\n evaluate(context: any): any[] {\r\n const leftResult = this.left.evaluate(context);\r\n const rightResult = this.right.evaluate(context);\r\n\r\n // Both operands must be node-sets\r\n const leftNodes = Array.isArray(leftResult) ? leftResult : [];\r\n const rightNodes = Array.isArray(rightResult) ? rightResult : [];\r\n\r\n // Combine and remove duplicates, preserving document order\r\n return this.unionNodes(leftNodes, rightNodes);\r\n }\r\n\r\n private unionNodes(left: any[], right: any[]): any[] {\r\n const seen = new Set();\r\n const result: any[] = [];\r\n\r\n // Add left nodes\r\n for (const node of left) {\r\n if (!seen.has(node)) {\r\n seen.add(node);\r\n result.push(node);\r\n }\r\n }\r\n\r\n // Add right nodes not already in result\r\n for (const node of right) {\r\n if (!seen.has(node)) {\r\n seen.add(node);\r\n result.push(node);\r\n }\r\n }\r\n\r\n // Sort by document order\r\n return this.sortByDocumentOrder(result);\r\n }\r\n\r\n private sortByDocumentOrder(nodes: any[]): any[] {\r\n return nodes.sort((a, b) => {\r\n if (a === b) return 0;\r\n\r\n // Use compareDocumentPosition if available (DOM Level 3)\r\n if (typeof a.compareDocumentPosition === 'function') {\r\n const position = a.compareDocumentPosition(b);\r\n if (position & 4) return -1; // b follows a\r\n if (position & 2) return 1; // a follows b\r\n }\r\n\r\n return 0;\r\n });\r\n }\r\n}\r\n","import { XPathContext, XPathResult } from '../context';\r\nimport { XPathNode } from '../node';\r\nimport { XPathExpression } from './expression';\r\n\r\nexport class XPathFunctionCall extends XPathExpression {\r\n name: string;\r\n args: XPathExpression[];\r\n\r\n constructor(name: string, args: XPathExpression[]) {\r\n super();\r\n this.name = name;\r\n this.args = args;\r\n }\r\n\r\n evaluate(context: XPathContext): XPathResult {\r\n const evaluatedArgs = this.args.map(arg => arg.evaluate(context));\r\n\r\n // Built-in XPath 1.0 functions\r\n switch (this.name) {\r\n // Node set functions\r\n case 'last':\r\n return context.size ?? 0;\r\n case 'position':\r\n return context.position ?? 0;\r\n case 'count':\r\n return Array.isArray(evaluatedArgs[0]) ? evaluatedArgs[0].length : 0;\r\n case 'local-name':\r\n return this.localName(evaluatedArgs, context);\r\n case 'namespace-uri':\r\n return this.namespaceUri(evaluatedArgs, context);\r\n case 'name':\r\n return this.nodeName(evaluatedArgs, context);\r\n\r\n // String functions\r\n case 'string':\r\n return this.stringValue(evaluatedArgs, context);\r\n case 'concat':\r\n return evaluatedArgs.map(String).join('');\r\n case 'starts-with':\r\n return String(evaluatedArgs[0]).startsWith(String(evaluatedArgs[1]));\r\n case 'contains':\r\n return String(evaluatedArgs[0]).includes(String(evaluatedArgs[1]));\r\n case 'substring-before':\r\n return this.substringBefore(evaluatedArgs);\r\n case 'substring-after':\r\n return this.substringAfter(evaluatedArgs);\r\n case 'substring':\r\n return this.substring(evaluatedArgs);\r\n case 'string-length':\r\n return this.stringLength(evaluatedArgs, context);\r\n case 'normalize-space':\r\n return this.normalizeSpace(evaluatedArgs, context);\r\n case 'translate':\r\n return this.translate(evaluatedArgs);\r\n\r\n // Boolean functions\r\n case 'boolean':\r\n return this.toBoolean(evaluatedArgs[0]);\r\n case 'not':\r\n return !this.toBoolean(evaluatedArgs[0]);\r\n case 'true':\r\n return true;\r\n case 'false':\r\n return false;\r\n case 'lang':\r\n return this.lang(evaluatedArgs, context);\r\n\r\n // Number functions\r\n case 'number':\r\n return this.toNumber(evaluatedArgs, context);\r\n case 'sum':\r\n return this.sum(evaluatedArgs);\r\n case 'floor':\r\n return Math.floor(Number(evaluatedArgs[0]));\r\n case 'ceiling':\r\n return Math.ceil(Number(evaluatedArgs[0]));\r\n case 'round':\r\n return Math.round(Number(evaluatedArgs[0]));\r\n\r\n default:\r\n // Check for custom functions in context\r\n if (context.functions && typeof context.functions[this.name] === 'function') {\r\n return context.functions[this.name](...evaluatedArgs);\r\n }\r\n throw new Error(`Unknown function: ${this.name}`);\r\n }\r\n }\r\n\r\n private toBoolean(value: XPathResult): boolean {\r\n if (typeof value === 'boolean') return value;\r\n if (typeof value === 'number') return value !== 0 && !isNaN(value);\r\n if (typeof value === 'string') return value.length > 0;\r\n if (Array.isArray(value)) return value.length > 0;\r\n return !!value;\r\n }\r\n\r\n private toNumber(args: XPathResult[], context: XPathContext): number {\r\n if (args.length === 0) {\r\n return Number(this.stringValue([], context));\r\n }\r\n return Number(args[0]);\r\n }\r\n\r\n private stringValue(args: XPathResult[], context: XPathContext): string {\r\n if (args.length === 0) {\r\n return context.node?.textContent ?? '';\r\n }\r\n const value = args[0];\r\n if (Array.isArray(value) && value.length > 0) {\r\n return value[0]?.textContent ?? String(value[0]);\r\n }\r\n return String(value);\r\n }\r\n\r\n private stringLength(args: XPathResult[], context: XPathContext): number {\r\n if (args.length === 0) {\r\n return this.stringValue([], context).length;\r\n }\r\n return String(args[0]).length;\r\n }\r\n\r\n private normalizeSpace(args: XPathResult[], context: XPathContext): string {\r\n const str = args.length === 0 ? this.stringValue([], context) : String(args[0]);\r\n return str.trim().replace(/\\s+/g, ' ');\r\n }\r\n\r\n private substringBefore(args: XPathResult[]): string {\r\n const str = String(args[0]);\r\n const search = String(args[1]);\r\n const index = str.indexOf(search);\r\n return index === -1 ? '' : str.substring(0, index);\r\n }\r\n\r\n private substringAfter(args: XPathResult[]): string {\r\n const str = String(args[0]);\r\n const search = String(args[1]);\r\n const index = str.indexOf(search);\r\n return index === -1 ? '' : str.substring(index + search.length);\r\n }\r\n\r\n private substring(args: XPathResult[]): string {\r\n const str = String(args[0]);\r\n // XPath uses 1-based indexing and rounds\r\n const start = Math.round(Number(args[1])) - 1;\r\n if (args.length === 2) {\r\n return str.substring(Math.max(0, start));\r\n }\r\n const length = Math.round(Number(args[2]));\r\n const adjustedStart = Math.max(0, start);\r\n const adjustedLength = Math.min(length - (adjustedStart - start), str.length - adjustedStart);\r\n return str.substring(adjustedStart, adjustedStart + adjustedLength);\r\n }\r\n\r\n private translate(args: XPathResult[]): string {\r\n const str = String(args[0]);\r\n const from = String(args[1]);\r\n const to = String(args[2]);\r\n let result = '';\r\n for (const char of str) {\r\n const index = from.indexOf(char);\r\n if (index === -1) {\r\n result += char;\r\n } else if (index < to.length) {\r\n result += to[index];\r\n }\r\n // If index >= to.length, character is removed\r\n }\r\n return result;\r\n }\r\n\r\n private localName(args: XPathResult[], context: XPathContext): string {\r\n const node = this.getNodeArg(args, context);\r\n return node?.localName ?? '';\r\n }\r\n\r\n private namespaceUri(args: XPathResult[], context: XPathContext): string {\r\n const node = this.getNodeArg(args, context);\r\n return node?.namespaceURI ?? '';\r\n }\r\n\r\n private nodeName(args: XPathResult[], context: XPathContext): string {\r\n const node = this.getNodeArg(args, context);\r\n return node?.nodeName ?? '';\r\n }\r\n\r\n private getNodeArg(args: XPathResult[], context: XPathContext): XPathNode | undefined {\r\n if (args.length > 0 && Array.isArray(args[0]) && args[0].length > 0) {\r\n return args[0][0];\r\n }\r\n return context.node;\r\n }\r\n\r\n private sum(args: XPathResult[]): number {\r\n const nodeSet = args[0];\r\n if (!Array.isArray(nodeSet)) return 0;\r\n return nodeSet.reduce((acc: number, node: XPathNode) => {\r\n const value = Number(node?.textContent ?? node);\r\n return acc + (isNaN(value) ? 0 : value);\r\n }, 0);\r\n }\r\n\r\n private lang(args: XPathResult[], context: XPathContext): boolean {\r\n const targetLang = String(args[0]).toLowerCase();\r\n let node = context.node;\r\n while (node) {\r\n const lang = node.getAttribute?.('xml:lang') || node.getAttribute?.('lang');\r\n if (lang) {\r\n const nodeLang = lang.toLowerCase();\r\n return nodeLang === targetLang || nodeLang.startsWith(targetLang + '-');\r\n }\r\n node = node.parentNode as XPathNode | undefined;\r\n }\r\n return false;\r\n }\r\n}\r\n","import { XPathToken } from './lexer/token';\r\nimport { TokenType } from './lexer/token-type';\r\nimport {\r\n XPathExpression,\r\n XPathStringLiteral,\r\n XPathNumberLiteral,\r\n XPathVariableReference,\r\n XPathUnaryExpression,\r\n XPathArithmeticExpression,\r\n ArithmeticOperator,\r\n XPathBinaryExpression,\r\n XPathLogicalExpression,\r\n XPathFunctionCall,\r\n XPathStep,\r\n AxisType,\r\n NodeTest,\r\n XPathPredicate,\r\n XPathLocationPath,\r\n XPathFilterExpression,\r\n XPathUnionExpression,\r\n} from './expressions';\r\n\r\n/**\r\n * Recursive descent parser for XPath 1.0 expressions.\r\n *\r\n * Grammar (simplified):\r\n * Expr ::= OrExpr\r\n * OrExpr ::= AndExpr ('or' AndExpr)*\r\n * AndExpr ::= EqualityExpr ('and' EqualityExpr)*\r\n * EqualityExpr ::= RelationalExpr (('=' | '!=') RelationalExpr)*\r\n * RelationalExpr ::= AdditiveExpr (('<' | '>' | '<=' | '>=') AdditiveExpr)*\r\n * AdditiveExpr ::= MultiplicativeExpr (('+' | '-') MultiplicativeExpr)*\r\n * MultiplicativeExpr ::= UnaryExpr (('*' | 'div' | 'mod') UnaryExpr)*\r\n * UnaryExpr ::= '-'* UnionExpr\r\n * UnionExpr ::= PathExpr ('|' PathExpr)*\r\n * PathExpr ::= LocationPath | FilterExpr (('/' | '//') RelativeLocationPath)?\r\n * FilterExpr ::= PrimaryExpr Predicate*\r\n * PrimaryExpr ::= VariableReference | '(' Expr ')' | Literal | Number | FunctionCall\r\n * LocationPath ::= RelativeLocationPath | AbsoluteLocationPath\r\n * Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep\r\n * Predicate ::= '[' Expr ']'\r\n */\r\nexport class XPathParser {\r\n private tokens: XPathToken[] = [];\r\n private current: number = 0;\r\n\r\n parse(tokens: XPathToken[]): XPathExpression {\r\n this.tokens = tokens;\r\n this.current = 0;\r\n\r\n if (tokens.length === 0) {\r\n throw new Error('Empty expression');\r\n }\r\n\r\n const expr = this.parseExpr();\r\n\r\n if (!this.isAtEnd()) {\r\n throw new Error(`Unexpected token: ${this.peek().lexeme}`);\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n // ==================== Token Management ====================\r\n\r\n private peek(): XPathToken {\r\n return this.tokens[this.current];\r\n }\r\n\r\n private peekNext(): XPathToken | undefined {\r\n return this.tokens[this.current + 1];\r\n }\r\n\r\n private previous(): XPathToken {\r\n return this.tokens[this.current - 1];\r\n }\r\n\r\n private isAtEnd(): boolean {\r\n return this.current >= this.tokens.length;\r\n }\r\n\r\n private advance(): XPathToken {\r\n if (!this.isAtEnd()) this.current++;\r\n return this.previous();\r\n }\r\n\r\n private check(type: TokenType): boolean {\r\n if (this.isAtEnd()) return false;\r\n return this.peek().type === type;\r\n }\r\n\r\n private checkLexeme(lexeme: string): boolean {\r\n if (this.isAtEnd()) return false;\r\n return this.peek().lexeme === lexeme;\r\n }\r\n\r\n private match(...types: TokenType[]): boolean {\r\n for (const type of types) {\r\n if (this.check(type)) {\r\n this.advance();\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private consume(type: TokenType, message: string): XPathToken {\r\n if (this.check(type)) return this.advance();\r\n throw new Error(`${message}. Got: ${this.peek()?.lexeme ?? 'EOF'}`);\r\n }\r\n\r\n // ==================== Expression Parsing ====================\r\n\r\n private parseExpr(): XPathExpression {\r\n return this.parseOrExpr();\r\n }\r\n\r\n private parseOrExpr(): XPathExpression {\r\n let left = this.parseAndExpr();\r\n\r\n while (this.check('OPERATOR') && this.peek().lexeme === 'or') {\r\n this.advance();\r\n const right = this.parseAndExpr();\r\n left = new XPathLogicalExpression(left, right, 'or');\r\n }\r\n\r\n return left;\r\n }\r\n\r\n private parseAndExpr(): XPathExpression {\r\n let left = this.parseEqualityExpr();\r\n\r\n while (this.check('OPERATOR') && this.peek().lexeme === 'and') {\r\n this.advance();\r\n const right = this.parseEqualityExpr();\r\n left = new XPathLogicalExpression(left, right, 'and');\r\n }\r\n\r\n return left;\r\n }\r\n\r\n private parseEqualityExpr(): XPathExpression {\r\n let left = this.parseRelationalExpr();\r\n\r\n while (this.match('EQUALS', 'NOT_EQUALS')) {\r\n const operator = this.previous().lexeme;\r\n const right = this.parseRelationalExpr();\r\n left = new XPathBinaryExpression(left, right, operator);\r\n }\r\n\r\n return left;\r\n }\r\n\r\n private parseRelationalExpr(): XPathExpression {\r\n let left = this.parseAdditiveExpr();\r\n\r\n while (this.match('LESS_THAN', 'GREATER_THAN', 'LESS_THAN_OR_EQUAL', 'GREATER_THAN_OR_EQUAL')) {\r\n const operator = this.previous().lexeme;\r\n const right = this.parseAdditiveExpr();\r\n left = new XPathBinaryExpression(left, right, operator);\r\n }\r\n\r\n return left;\r\n }\r\n\r\n private parseAdditiveExpr(): XPathExpression {\r\n let left = this.parseMultiplicativeExpr();\r\n\r\n while (this.match('PLUS', 'MINUS')) {\r\n const operator = this.previous().lexeme as ArithmeticOperator;\r\n const right = this.parseMultiplicativeExpr();\r\n left = new XPathArithmeticExpression(left, right, operator);\r\n }\r\n\r\n return left;\r\n }\r\n\r\n private parseMultiplicativeExpr(): XPathExpression {\r\n let left = this.parseUnaryExpr();\r\n\r\n while (true) {\r\n if (this.match('ASTERISK')) {\r\n const right = this.parseUnaryExpr();\r\n left = new XPathArithmeticExpression(left, right, '*');\r\n } else if (this.check('OPERATOR') && (this.peek().lexeme === 'div' || this.peek().lexeme === 'mod')) {\r\n const operator = this.advance().lexeme as ArithmeticOperator;\r\n const right = this.parseUnaryExpr();\r\n left = new XPathArithmeticExpression(left, right, operator);\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return left;\r\n }\r\n\r\n private parseUnaryExpr(): XPathExpression {\r\n if (this.match('MINUS')) {\r\n const operand = this.parseUnaryExpr();\r\n return new XPathUnaryExpression('-', operand);\r\n }\r\n\r\n return this.parseUnionExpr();\r\n }\r\n\r\n private parseUnionExpr(): XPathExpression {\r\n let left = this.parsePathExpr();\r\n\r\n while (this.match('PIPE')) {\r\n const right = this.parsePathExpr();\r\n left = new XPathUnionExpression(left, right);\r\n }\r\n\r\n return left;\r\n }\r\n\r\n // ==================== Path Expression Parsing ====================\r\n\r\n private parsePathExpr(): XPathExpression {\r\n // Check if this starts a location path\r\n if (this.check('SLASH') || this.check('DOUBLE_SLASH')) {\r\n return this.parseLocationPath();\r\n }\r\n\r\n // Check for axis or abbreviated step that starts a relative location path\r\n if (this.isStepStart()) {\r\n return this.parseLocationPath();\r\n }\r\n\r\n // Otherwise it's a filter expression (possibly followed by path)\r\n const filterExpr = this.parseFilterExpr();\r\n\r\n // Check if followed by '/' or '//'\r\n if (this.match('SLASH', 'DOUBLE_SLASH')) {\r\n const isDescendant = this.previous().type === 'DOUBLE_SLASH';\r\n const steps = this.parseRelativeLocationPath();\r\n\r\n if (isDescendant) {\r\n // Insert descendant-or-self::node() step\r\n steps.unshift(new XPathStep('descendant-or-self', { type: 'node-type', nodeType: 'node' }));\r\n }\r\n\r\n // Combine filter expression with location path\r\n // The filter expression becomes the context for the path\r\n return new XPathFilterExpression(filterExpr, new XPathLocationPath(steps, false));\r\n }\r\n\r\n return filterExpr;\r\n }\r\n\r\n private isStepStart(): boolean {\r\n if (this.isAtEnd()) return false;\r\n\r\n const token = this.peek();\r\n\r\n // Abbreviated steps\r\n if (token.type === 'DOT' || token.type === 'DOT_DOT') return true;\r\n\r\n // Attribute axis abbreviation\r\n if (token.type === 'AT') return true;\r\n\r\n // Axis name followed by ::\r\n if (token.type === 'LOCATION') return true;\r\n\r\n // Node type test\r\n if (token.type === 'NODE_TYPE') return true;\r\n\r\n // Wildcard\r\n if (token.type === 'ASTERISK') return true;\r\n\r\n // Name test (identifier that's not a function call)\r\n // OPERATOR tokens (div, mod, and, or) can also be element names\r\n // FUNCTION tokens (id, count, etc.) can also be element/attribute names\r\n if (token.type === 'IDENTIFIER' || token.type === 'OPERATOR' || token.type === 'FUNCTION') {\r\n const next = this.peekNext();\r\n // It's a step if not followed by '(' (which would make it a function call)\r\n return !next || next.type !== 'OPEN_PAREN';\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private parseLocationPath(): XPathExpression {\r\n let absolute = false;\r\n const steps: XPathStep[] = [];\r\n\r\n if (this.match('SLASH')) {\r\n absolute = true;\r\n\r\n // Check if there's a relative path following\r\n if (!this.isAtEnd() && this.isStepStart()) {\r\n steps.push(...this.parseRelativeLocationPath());\r\n }\r\n } else if (this.match('DOUBLE_SLASH')) {\r\n absolute = true;\r\n\r\n // '//' is shorthand for '/descendant-or-self::node()/'\r\n steps.push(new XPathStep('descendant-or-self', { type: 'node-type', nodeType: 'node' }));\r\n steps.push(...this.parseRelativeLocationPath());\r\n } else {\r\n // Relative location path\r\n steps.push(...this.parseRelativeLocationPath());\r\n }\r\n\r\n return new XPathLocationPath(steps, absolute);\r\n }\r\n\r\n private parseRelativeLocationPath(): XPathStep[] {\r\n const steps: XPathStep[] = [];\r\n\r\n steps.push(this.parseStep());\r\n\r\n while (this.match('SLASH', 'DOUBLE_SLASH')) {\r\n const isDescendant = this.previous().type === 'DOUBLE_SLASH';\r\n\r\n if (isDescendant) {\r\n // '//' is shorthand for '/descendant-or-self::node()/'\r\n steps.push(new XPathStep('descendant-or-self', { type: 'node-type', nodeType: 'node' }));\r\n }\r\n\r\n steps.push(this.parseStep());\r\n }\r\n\r\n return steps;\r\n }\r\n\r\n private parseStep(): XPathStep {\r\n // Handle abbreviated steps\r\n if (this.match('DOT')) {\r\n return new XPathStep('self', { type: 'node-type', nodeType: 'node' });\r\n }\r\n\r\n if (this.match('DOT_DOT')) {\r\n return new XPathStep('parent', { type: 'node-type', nodeType: 'node' });\r\n }\r\n\r\n // Parse axis\r\n let axis: AxisType = 'child'; // default axis\r\n\r\n if (this.match('AT')) {\r\n axis = 'attribute';\r\n } else if (this.check('LOCATION')) {\r\n // Only treat as axis if followed by ::\r\n const next = this.peekNext();\r\n if (next && next.type === 'COLON_COLON') {\r\n axis = this.advance().lexeme as AxisType;\r\n this.advance(); // consume ::\r\n }\r\n // Otherwise, it's an element name that happens to match an axis name\r\n }\r\n\r\n // Parse node test\r\n const nodeTest = this.parseNodeTest();\r\n\r\n // Parse predicates\r\n const predicates = this.parsePredicates();\r\n\r\n return new XPathStep(axis, nodeTest, predicates);\r\n }\r\n\r\n private parseNodeTest(): NodeTest {\r\n // Wildcard\r\n if (this.match('ASTERISK')) {\r\n return { type: 'wildcard' };\r\n }\r\n\r\n // Node type test: node(), text(), comment(), processing-instruction()\r\n // Only if followed by '(' - otherwise it's a name test\r\n if (this.check('NODE_TYPE')) {\r\n const next = this.peekNext();\r\n if (next && next.type === 'OPEN_PAREN') {\r\n const nodeType = this.advance().lexeme as 'node' | 'text' | 'comment' | 'processing-instruction';\r\n this.advance(); // consume '('\r\n\r\n // processing-instruction can have an optional literal argument\r\n if (nodeType === 'processing-instruction' && this.check('STRING')) {\r\n const name = this.advance().lexeme;\r\n this.consume('CLOSE_PAREN', \"Expected ')' after processing-instruction name\");\r\n return { type: 'processing-instruction', name };\r\n }\r\n\r\n this.consume('CLOSE_PAREN', \"Expected ')' after node type\");\r\n return { type: 'node-type', nodeType };\r\n }\r\n // Fall through to name test if not followed by '('\r\n }\r\n\r\n // Name test - can be IDENTIFIER, LOCATION (axis names), FUNCTION (function names), NODE_TYPE,\r\n // or OPERATOR (div, mod, and, or can be element names too)\r\n // All of these can be used as element names in XPath\r\n if (this.check('IDENTIFIER') || this.check('LOCATION') || this.check('FUNCTION') ||\r\n this.check('NODE_TYPE') || this.check('OPERATOR')) {\r\n const name = this.advance().lexeme;\r\n\r\n // Check for namespace prefix\r\n if (this.match('COLON')) {\r\n if (this.match('ASTERISK')) {\r\n // prefix:* - match any element in namespace\r\n return { type: 'wildcard', name: `${name}:*` };\r\n }\r\n // Local name can also be any of these token types\r\n if (this.check('IDENTIFIER') || this.check('LOCATION') || this.check('FUNCTION') ||\r\n this.check('NODE_TYPE') || this.check('OPERATOR')) {\r\n const localName = this.advance().lexeme;\r\n return { type: 'name', name: `${name}:${localName}` };\r\n }\r\n throw new Error('Expected local name after namespace prefix');\r\n }\r\n\r\n return { type: 'name', name };\r\n }\r\n\r\n throw new Error(`Expected node test, got: ${this.peek()?.lexeme ?? 'EOF'}`);\r\n }\r\n\r\n private parsePredicates(): XPathExpression[] {\r\n const predicates: XPathExpression[] = [];\r\n\r\n while (this.match('OPEN_SQUARE_BRACKET')) {\r\n const expr = this.parseExpr();\r\n this.consume('CLOSE_SQUARE_BRACKET', \"Expected ']' after predicate\");\r\n predicates.push(new XPathPredicate(expr));\r\n }\r\n\r\n return predicates;\r\n }\r\n\r\n // ==================== Filter Expression Parsing ====================\r\n\r\n private parseFilterExpr(): XPathExpression {\r\n let expr = this.parsePrimaryExpr();\r\n\r\n // Apply predicates\r\n while (this.check('OPEN_SQUARE_BRACKET')) {\r\n const predicates = this.parsePredicates();\r\n for (const predicate of predicates) {\r\n expr = new XPathFilterExpression(expr, predicate);\r\n }\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n private parsePrimaryExpr(): XPathExpression {\r\n // Variable reference: $name\r\n if (this.match('DOLLAR')) {\r\n const name = this.consume('IDENTIFIER', 'Expected variable name after $').lexeme;\r\n return new XPathVariableReference(name);\r\n }\r\n\r\n // Parenthesized expression\r\n if (this.match('OPEN_PAREN')) {\r\n const expr = this.parseExpr();\r\n this.consume('CLOSE_PAREN', \"Expected ')' after expression\");\r\n return expr;\r\n }\r\n\r\n // String literal\r\n if (this.check('STRING')) {\r\n const value = this.advance().lexeme;\r\n return new XPathStringLiteral(value);\r\n }\r\n\r\n // Number literal\r\n if (this.check('NUMBER')) {\r\n const value = parseFloat(this.advance().lexeme);\r\n return new XPathNumberLiteral(value);\r\n }\r\n\r\n // Function call\r\n if (this.check('FUNCTION') || this.check('IDENTIFIER')) {\r\n const next = this.peekNext();\r\n if (next && next.type === 'OPEN_PAREN') {\r\n return this.parseFunctionCall();\r\n }\r\n }\r\n\r\n throw new Error(`Unexpected token in primary expression: ${this.peek()?.lexeme ?? 'EOF'}`);\r\n }\r\n\r\n private parseFunctionCall(): XPathExpression {\r\n const name = this.advance().lexeme;\r\n this.consume('OPEN_PAREN', \"Expected '(' after function name\");\r\n\r\n const args: XPathExpression[] = [];\r\n\r\n if (!this.check('CLOSE_PAREN')) {\r\n do {\r\n args.push(this.parseExpr());\r\n } while (this.match('COMMA'));\r\n }\r\n\r\n this.consume('CLOSE_PAREN', \"Expected ')' after function arguments\");\r\n\r\n return new XPathFunctionCall(name, args);\r\n }\r\n}\r\n","import { XPathNode } from \"./node\";\r\n\r\n/**\r\n * Node type constants (matching DOM specification)\r\n */\r\nexport const NodeType = {\r\n ELEMENT_NODE: 1,\r\n ATTRIBUTE_NODE: 2,\r\n TEXT_NODE: 3,\r\n CDATA_SECTION_NODE: 4,\r\n PROCESSING_INSTRUCTION_NODE: 7,\r\n COMMENT_NODE: 8,\r\n DOCUMENT_NODE: 9,\r\n DOCUMENT_FRAGMENT_NODE: 11,\r\n} as const;\r\n\r\n/**\r\n * Type for custom XPath functions that can be registered in the context.\r\n */\r\nexport type XPathFunction = (...args: any[]) => any;\r\n\r\n/**\r\n * Type for the variables map in the context.\r\n */\r\nexport type XPathVariables = Record<string, any>;\r\n\r\n/**\r\n * Type for the custom functions map in the context.\r\n */\r\nexport type XPathFunctions = Record<string, XPathFunction>;\r\n\r\n/**\r\n * Type for namespace bindings (prefix -> namespace URI).\r\n */\r\nexport type XPathNamespaces = Record<string, string>;\r\n\r\n/**\r\n * The evaluation context for XPath expressions.\r\n *\r\n * This context is passed to all expression evaluate() methods and contains:\r\n * - The current context node\r\n * - Position information for predicates\r\n * - Variable bindings\r\n * - Custom function definitions\r\n */\r\nexport interface XPathContext {\r\n /**\r\n * The current context node being evaluated.\r\n */\r\n node?: XPathNode;\r\n\r\n /**\r\n * The position of the context node within the current node set (1-based).\r\n * Used by position() function and numeric predicates.\r\n */\r\n position?: number;\r\n\r\n /**\r\n * The size of the current node set.\r\n * Used by last() function.\r\n */\r\n size?: number;\r\n\r\n /**\r\n * The full node list for the current context.\r\n * Used by the 'self-and-siblings' axis (XSLT-specific).\r\n */\r\n nodeList?: XPathNode[];\r\n\r\n /**\r\n * Variable bindings available during evaluation.\r\n * Variables are referenced in XPath as $variableName.\r\n */\r\n variables?: XPathVariables;\r\n\r\n /**\r\n * Custom functions available during evaluation.\r\n * These extend the built-in XPath 1.0 function library.\r\n */\r\n functions?: XPathFunctions;\r\n\r\n /**\r\n * Namespace bindings for resolving prefixes in XPath expressions.\r\n * Maps namespace prefixes to namespace URIs.\r\n * Example: { \"atom\": \"http://www.w3.org/2005/Atom\" }\r\n */\r\n namespaces?: XPathNamespaces;\r\n}\r\n\r\n/**\r\n * Result types that can be returned from XPath evaluation.\r\n */\r\nexport type XPathResult =\r\n | XPathNode[] // Node set\r\n | string // String\r\n | number // Number\r\n | boolean; // Boolean\r\n\r\n/**\r\n * Creates a new XPath context with the given node as the context node.\r\n */\r\nexport function createContext(node: XPathNode, options?: Partial<XPathContext>): XPathContext {\r\n return {\r\n node,\r\n position: 1,\r\n size: 1,\r\n ...options,\r\n };\r\n}\r\n\r\n/**\r\n * Creates a child context for predicate evaluation.\r\n * Preserves variables and functions from parent context.\r\n */\r\nexport function createPredicateContext(\r\n parent: XPathContext,\r\n node: XPathNode,\r\n position: number,\r\n size: number\r\n): XPathContext {\r\n return {\r\n ...parent,\r\n node,\r\n position,\r\n size,\r\n };\r\n}\r\n","import { XNode } from \"../../dom\";\r\nimport { NodeValue } from \"./node-value\";\r\n\r\nexport class StringValue implements NodeValue {\r\n value: any;\r\n type: string;\r\n\r\n constructor(value: any) {\r\n this.value = value;\r\n this.type = 'string';\r\n }\r\n\r\n stringValue(): string {\r\n return String(this.value);\r\n }\r\n\r\n booleanValue() {\r\n return this.value.length > 0;\r\n }\r\n\r\n numberValue() {\r\n return this.value - 0;\r\n }\r\n\r\n nodeSetValue(): XNode[] {\r\n throw this;\r\n }\r\n}\r\n","import { XNode } from \"../../dom\";\r\nimport { NodeValue } from \"./node-value\";\r\n\r\nexport class NumberValue implements NodeValue {\r\n value: any;\r\n type: string;\r\n\r\n constructor(value: any) {\r\n this.value = value;\r\n this.type = 'number';\r\n }\r\n\r\n stringValue(): string {\r\n return `${this.value}`;\r\n }\r\n\r\n booleanValue() {\r\n return !!this.value;\r\n }\r\n\r\n numberValue() {\r\n return this.value - 0;\r\n }\r\n\r\n nodeSetValue(): XNode[] {\r\n throw this;\r\n }\r\n}\r\n","import { XNode } from \"../../dom\";\r\nimport { NodeValue } from \"./node-value\";\r\n\r\nexport class BooleanValue implements NodeValue {\r\n value: any;\r\n type: string;\r\n\r\n constructor(value: any) {\r\n this.value = value;\r\n this.type = 'boolean';\r\n }\r\n\r\n stringValue(): string {\r\n return `${this.value}`;\r\n }\r\n\r\n booleanValue() {\r\n return this.value;\r\n }\r\n\r\n numberValue() {\r\n return this.value ? 1 : 0;\r\n }\r\n\r\n nodeSetValue(): XNode[] {\r\n throw this;\r\n }\r\n}\r\n","// Copyright 2023-2024 Design Liquido\r\n// Copyright 2018 Johannes Wilm\r\n// Copyright 2005 Google Inc.\r\n// All Rights Reserved\r\n\r\nimport { XDocument } from \"./xdocument\";\r\nimport { XNode } from './xnode';\r\n\r\n// Wrapper around DOM methods so we can condense their invocations.\r\nexport function domGetAttributeValue(node: XNode, name: string) {\r\n return node.getAttributeValue(name);\r\n}\r\n\r\nexport function domSetAttribute(node: XNode, name: string, value: any) {\r\n return node.setAttribute(name, value);\r\n}\r\n\r\nexport function domAppendChild(node: XNode, child: any) {\r\n return node.appendChild(child);\r\n}\r\n\r\nexport function domCreateTextNode(node: XDocument, text: string) {\r\n return node.createTextNode(text);\r\n}\r\n\r\nexport function domCreateElement(doc: XDocument, name: string) {\r\n return doc.createElement(name);\r\n}\r\n\r\nexport function domCreateCDATASection(doc: XDocument, data: any) {\r\n return doc.createCDATASection(data);\r\n}\r\n\r\nexport function domCreateComment(doc: any, text: any) {\r\n return doc.createComment(text);\r\n}\r\n\r\nexport function domCreateDocumentFragment(doc: XDocument): XNode {\r\n return doc.createDocumentFragment();\r\n}\r\n\r\nexport function domCreateDTDSection(doc: XDocument, data: any) {\r\n return doc.createDTDSection(data);\r\n}\r\n\r\n//XDocument.prototype = new XNode(DOM_DOCUMENT_NODE, '#document');\r\n","// Based on <http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247>\r\nexport const DOM_ELEMENT_NODE = 1;\r\nexport const DOM_ATTRIBUTE_NODE = 2;\r\nexport const DOM_TEXT_NODE = 3;\r\nexport const DOM_CDATA_SECTION_NODE = 4;\r\nexport const DOM_ENTITY_REFERENCE_NODE = 5;\r\nexport const DOM_ENTITY_NODE = 6;\r\nexport const DOM_PROCESSING_INSTRUCTION_NODE = 7;\r\nexport const DOM_COMMENT_NODE = 8;\r\nexport const DOM_DOCUMENT_NODE = 9;\r\nexport const DOM_DOCUMENT_TYPE_NODE = 10;\r\nexport const DOM_DOCUMENT_FRAGMENT_NODE = 11;\r\nexport const DOM_NOTATION_NODE = 12;\r\n","import { DOM_ATTRIBUTE_NODE, DOM_ELEMENT_NODE } from '../constants';\r\n\r\n// operate on native DOM nodes.\r\n/**\r\n * Our W3C DOM Node implementation. Note we call it XNode because we\r\n * can't define the identifier Node. We do this mostly for Opera,\r\n * where we can't reuse the HTML DOM for parsing our own XML, and for\r\n * Safari, where it is too expensive to have the template processor.\r\n */\r\nexport class XNode {\r\n id: number;\r\n childNodes: XNode[];\r\n nodeType: number;\r\n nodeName: string;\r\n nodeValue: any;\r\n firstChild: XNode;\r\n lastChild: XNode;\r\n nextSibling: XNode;\r\n previousSibling: XNode;\r\n siblingPosition: number;\r\n\r\n ownerDocument: any;\r\n namespaceUri: any;\r\n prefix: string;\r\n localName: string;\r\n\r\n parentNode: XNode;\r\n\r\n visited: boolean;\r\n escape: boolean;\r\n\r\n static _unusedXNodes: any[] = [];\r\n\r\n constructor(type: number, name: string, opt_value: any, opt_owner: any, opt_namespace?: any) {\r\n this.id = Math.random() * (Number.MAX_SAFE_INTEGER - 1) + 1;\r\n this.childNodes = [];\r\n this.visited = false;\r\n this.escape = true;\r\n this.siblingPosition = -1;\r\n\r\n this.init(type, name, opt_value, opt_owner, opt_namespace);\r\n }\r\n\r\n /**\r\n * Node initialization. Called by the constructor and `recycle` method.\r\n * @param type The node type.\r\n * @param name The node name.\r\n * @param value The node value.\r\n * @param owner The node owner.\r\n * @param namespaceUri The node namespace.\r\n */\r\n init(type: number, name: string, value: string, owner: any, namespaceUri: any) {\r\n this.nodeType = type - 0;\r\n this.nodeName = `${name}`;\r\n this.nodeValue = `${value}`;\r\n this.ownerDocument = owner;\r\n this.namespaceUri = namespaceUri || null;\r\n [this.prefix, this.localName] = this.qualifiedNameToParts(`${name}`);\r\n\r\n this.firstChild = null;\r\n this.lastChild = null;\r\n this.nextSibling = null;\r\n this.previousSibling = null;\r\n this.parentNode = null;\r\n }\r\n\r\n protected qualifiedNameToParts(name: string) {\r\n if (name.includes(':')) {\r\n return name.split(':');\r\n }\r\n\r\n return [null, name];\r\n }\r\n\r\n // Traverses the element nodes in the DOM section underneath the given\r\n // node and invokes the given callbacks as methods on every element\r\n // node encountered. Function opt_pre is invoked before a node's\r\n // children are traversed; opt_post is invoked after they are\r\n // traversed. Traversal will not be continued if a callback function\r\n // returns boolean false. NOTE(mesch): copied from\r\n // <//google3/maps/webmaps/javascript/dom.js>.\r\n protected domTraverseElements(node: XNode, opt_pre: Function, opt_post: any) {\r\n let ret;\r\n if (opt_pre) {\r\n ret = opt_pre.call(null, node);\r\n if (typeof ret == 'boolean' && !ret) {\r\n return false;\r\n }\r\n }\r\n\r\n for (let c = node.firstChild; c; c = c.nextSibling) {\r\n if (c.nodeType == DOM_ELEMENT_NODE) {\r\n ret = this.domTraverseElements.call(this, c, opt_pre, opt_post);\r\n if (typeof ret == 'boolean' && !ret) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n if (opt_post) {\r\n ret = opt_post.call(null, node);\r\n if (typeof ret == 'boolean' && !ret) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n // TODO: Do we still need this?\r\n static recycle(node: any) {\r\n if (!node) {\r\n return;\r\n }\r\n\r\n if (node.constructor.name === 'XDocument') {\r\n this.recycle((node as any).documentElement);\r\n return;\r\n }\r\n\r\n if (node.constructor != this) {\r\n return;\r\n }\r\n\r\n this._unusedXNodes.push(node);\r\n /* for (let a = 0; a < node.attributes.length; ++a) {\r\n this.recycle(node.attributes[a]);\r\n } */\r\n\r\n for (let c = 0; c < node.childNodes.length; ++c) {\r\n this.recycle(node.childNodes[c]);\r\n }\r\n\r\n // node.attributes.length = 0;\r\n node.childNodes.length = 0;\r\n node.init.call(0, '', '', null);\r\n }\r\n\r\n static create(type: any, name: string, value: any, owner: any, namespace?: any): XNode {\r\n if (this._unusedXNodes.length > 0) {\r\n const node = this._unusedXNodes.pop();\r\n node.init(type, name, value, owner, namespace);\r\n return node;\r\n }\r\n\r\n return new XNode(type, name, value, owner, namespace);\r\n }\r\n\r\n static clone(node: XNode, newOwner: XNode): XNode {\r\n const newNode = new XNode(node.nodeType, node.nodeName, node.nodeValue, newOwner, node.namespaceUri);\r\n newNode.id = node.id;\r\n for (let child of node.childNodes) {\r\n newNode.appendChild(XNode.clone(child, newNode));\r\n }\r\n\r\n /* for (let attribute of node.attributes) {\r\n newNode.setAttribute(attribute.nodeName, attribute.nodeValue);\r\n } */\r\n\r\n return newNode;\r\n }\r\n\r\n appendChild(node: XNode) {\r\n // firstChild\r\n if (this.childNodes.length === 0) {\r\n this.firstChild = node;\r\n }\r\n\r\n // previousSibling\r\n node.previousSibling = this.lastChild;\r\n\r\n // nextSibling\r\n node.nextSibling = null;\r\n if (this.lastChild) {\r\n this.lastChild.nextSibling = node;\r\n }\r\n\r\n // parentNode\r\n node.parentNode = this;\r\n\r\n // lastChild\r\n this.lastChild = node;\r\n\r\n // childNodes\r\n this.childNodes.push(node);\r\n }\r\n\r\n replaceChild(newNode: any, oldNode: any) {\r\n if (oldNode == newNode) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this.childNodes.length; ++i) {\r\n if (this.childNodes[i] == oldNode) {\r\n this.childNodes[i] = newNode;\r\n\r\n let p = oldNode.parentNode;\r\n oldNode.parentNode = null;\r\n newNode.parentNode = p;\r\n\r\n p = oldNode.previousSibling;\r\n oldNode.previousSibling = null;\r\n newNode.previousSibling = p;\r\n if (newNode.previousSibling) {\r\n newNode.previousSibling.nextSibling = newNode;\r\n }\r\n\r\n p = oldNode.nextSibling;\r\n oldNode.nextSibling = null;\r\n newNode.nextSibling = p;\r\n if (newNode.nextSibling) {\r\n newNode.nextSibling.previousSibling = newNode;\r\n }\r\n\r\n if (this.firstChild == oldNode) {\r\n this.firstChild = newNode;\r\n }\r\n\r\n if (this.lastChild == oldNode) {\r\n this.lastChild = newNode;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n insertBefore(newNode: any, oldNode: any) {\r\n if (oldNode == newNode) {\r\n return;\r\n }\r\n\r\n if (oldNode.parentNode != this) {\r\n return;\r\n }\r\n\r\n if (newNode.parentNode) {\r\n newNode.parentNode.removeChild(newNode);\r\n }\r\n\r\n const newChildren = [];\r\n\r\n for (const c of this.childNodes) {\r\n if (c == oldNode) {\r\n newChildren.push(newNode);\r\n\r\n newNode.parentNode = this;\r\n\r\n newNode.previousSibling = oldNode.previousSibling;\r\n oldNode.previousSibling = newNode;\r\n if (newNode.previousSibling) {\r\n newNode.previousSibling.nextSibling = newNode;\r\n }\r\n\r\n newNode.nextSibling = oldNode;\r\n\r\n if (this.firstChild == oldNode) {\r\n this.firstChild = newNode;\r\n }\r\n }\r\n newChildren.push(c);\r\n }\r\n\r\n this.childNodes = newChildren;\r\n }\r\n\r\n removeChild(node: XNode) {\r\n const newChildren = [];\r\n\r\n for (const c of this.childNodes) {\r\n if (c != node) {\r\n newChildren.push(c);\r\n } else {\r\n if (c.previousSibling) {\r\n c.previousSibling.nextSibling = c.nextSibling;\r\n }\r\n if (c.nextSibling) {\r\n c.nextSibling.previousSibling = c.previousSibling;\r\n }\r\n if (this.firstChild == c) {\r\n this.firstChild = c.nextSibling;\r\n }\r\n if (this.lastChild == c) {\r\n this.lastChild = c.previousSibling;\r\n }\r\n }\r\n }\r\n\r\n this.childNodes = newChildren;\r\n }\r\n\r\n hasAttributes() {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n return attributes.length > 0;\r\n }\r\n\r\n setAttribute(name: string, value: any) {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < attributes.length; ++i) {\r\n if (attributes[i].nodeName == name) {\r\n attributes[i].nodeValue = `${value}`;\r\n return;\r\n }\r\n }\r\n\r\n const newAttribute = XNode.create(DOM_ATTRIBUTE_NODE, name, value, this);\r\n newAttribute.parentNode = this;\r\n this.appendChild(newAttribute);\r\n }\r\n\r\n setAttributeNS(namespace: any, name: any, value: any) {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < attributes.length; ++i) {\r\n const attribute = attributes[i];\r\n if (\r\n attribute.namespaceUri == namespace &&\r\n attribute.localName == this.qualifiedNameToParts(`${name}`)[1]\r\n ) {\r\n attribute.nodeValue = `${value}`;\r\n attribute.nodeName = `${name}`;\r\n attribute.prefix = this.qualifiedNameToParts(`${name}`)[0];\r\n return;\r\n }\r\n }\r\n\r\n const newAttribute = XNode.create(DOM_ATTRIBUTE_NODE, name, value, this, namespace);\r\n newAttribute.parentNode = this;\r\n this.appendChild(newAttribute);\r\n }\r\n\r\n getAttributeValue(name: string): any {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < attributes.length; ++i) {\r\n if (attributes[i].nodeName === name) {\r\n return attributes[i].nodeValue;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getAttributeNS(namespace: any, localName: any) {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < attributes.length; ++i) {\r\n const attribute = attributes[i];\r\n if (attribute.namespaceUri === namespace && attribute.localName === localName) {\r\n return attribute.nodeValue;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n hasAttribute(name: string) {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < attributes.length; ++i) {\r\n if (attributes[i].nodeName === name) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n hasAttributeNS(namespace: string, localName: string) {\r\n const attributes = this.childNodes.filter(n => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < attributes.length; ++i) {\r\n const attribute = attributes[i];\r\n if (attribute.namespaceUri === namespace && attribute.localName === localName) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n removeAttribute(name: string) {\r\n const newChildNodes: XNode[] = [];\r\n for (let i = 0; i < this.childNodes.length; ++i) {\r\n const childNode = this.childNodes[i];\r\n if (childNode.nodeType !== DOM_ATTRIBUTE_NODE) {\r\n newChildNodes.push(childNode);\r\n continue;\r\n }\r\n\r\n if (childNode.nodeName !== name) {\r\n newChildNodes.push(childNode);\r\n }\r\n }\r\n\r\n this.childNodes = newChildNodes;\r\n }\r\n\r\n removeAttributeNS(namespace: string, localName: string) {\r\n const newChildNodes: XNode[] = [];\r\n for (let i = 0; i < this.childNodes.length; ++i) {\r\n const childNode = this.childNodes[i];\r\n if (childNode.nodeType !== DOM_ATTRIBUTE_NODE) {\r\n newChildNodes.push(childNode);\r\n continue;\r\n }\r\n\r\n if (childNode.localName !== localName || childNode.namespaceUri !== namespace) {\r\n newChildNodes.push(childNode);\r\n }\r\n }\r\n\r\n this.childNodes = newChildNodes;\r\n }\r\n\r\n getElementsByTagName(name: string) {\r\n const ret = [];\r\n const self = this;\r\n if ('*' == name) {\r\n this.domTraverseElements(\r\n this,\r\n (node: XNode) => {\r\n if (self == node) return;\r\n ret.push(node);\r\n },\r\n null\r\n );\r\n } else {\r\n this.domTraverseElements(\r\n this,\r\n (node: XNode) => {\r\n if (self == node) return;\r\n if (node.nodeName == name) {\r\n ret.push(node);\r\n }\r\n },\r\n null\r\n );\r\n }\r\n return ret;\r\n }\r\n\r\n getElementsByTagNameNS(namespace: string, localName: string) {\r\n const ret = [];\r\n const self = this;\r\n if ('*' == namespace && '*' == localName) {\r\n this.domTraverseElements(\r\n this,\r\n (node: any) => {\r\n if (self == node) return;\r\n ret.push(node);\r\n },\r\n null\r\n );\r\n } else if ('*' == namespace) {\r\n this.domTraverseElements(\r\n this,\r\n (node: any) => {\r\n if (self == node) return;\r\n if (node.localName == localName) ret.push(node);\r\n },\r\n null\r\n );\r\n } else if ('*' == localName) {\r\n this.domTraverseElements(\r\n this,\r\n (node: any) => {\r\n if (self == node) return;\r\n if (node.namespaceUri == namespace) ret.push(node);\r\n },\r\n null\r\n );\r\n } else {\r\n this.domTraverseElements(\r\n this,\r\n (node: any) => {\r\n if (self == node) return;\r\n if (node.localName == localName && node.namespaceUri == namespace) {\r\n ret.push(node);\r\n }\r\n },\r\n null\r\n );\r\n }\r\n return ret;\r\n }\r\n\r\n getElementById(id: any): any {\r\n let ret = null;\r\n this.domTraverseElements(\r\n this,\r\n (node: any) => {\r\n if (node.getAttributeValue('id') == id) {\r\n ret = node;\r\n return false;\r\n }\r\n },\r\n null\r\n );\r\n return ret;\r\n }\r\n\r\n getAncestorByLocalName(localName: string): XNode | undefined {\r\n if (this.parentNode === null || this.parentNode === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (this.parentNode.localName === localName) {\r\n return this.parentNode;\r\n }\r\n\r\n return this.parentNode.getAncestorByLocalName(localName);\r\n }\r\n\r\n getAncestorById(id: number): XNode | undefined {\r\n if (this.parentNode === null || this.parentNode === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (this.parentNode.id === id) {\r\n return this.parentNode;\r\n }\r\n\r\n return this.parentNode.getAncestorById(id);\r\n }\r\n\r\n toString(): string {\r\n return `${this.nodeType}, ${this.nodeName}, ${this.nodeValue}`;\r\n }\r\n}\r\n","import {\r\n DOM_ATTRIBUTE_NODE,\r\n DOM_CDATA_SECTION_NODE,\r\n DOM_COMMENT_NODE,\r\n DOM_DOCUMENT_FRAGMENT_NODE,\r\n DOM_DOCUMENT_NODE,\r\n DOM_DOCUMENT_TYPE_NODE,\r\n DOM_ELEMENT_NODE,\r\n DOM_TEXT_NODE\r\n} from '../constants';\r\nimport { XNode } from './xnode';\r\n\r\nexport class XDocument extends XNode {\r\n documentElement: any;\r\n\r\n constructor() {\r\n // NOTE(mesch): According to the DOM Spec, ownerDocument of a\r\n // document node is null.\r\n super(DOM_DOCUMENT_NODE, '#document', null, null);\r\n this.documentElement = null;\r\n }\r\n\r\n // TODO: Do we still need this?\r\n /* clear() {\r\n XNode.recycle(this.documentElement);\r\n this.documentElement = null;\r\n } */\r\n\r\n appendChild(node: any) {\r\n super.appendChild(node);\r\n this.documentElement = this.childNodes[0];\r\n }\r\n\r\n createElement(name: string): XNode {\r\n return XNode.create(DOM_ELEMENT_NODE, name, null, this);\r\n }\r\n\r\n createElementNS(namespace: any, name: any) {\r\n return XNode.create(DOM_ELEMENT_NODE, name, null, this, namespace);\r\n }\r\n\r\n createDocumentFragment(): XNode {\r\n return XNode.create(DOM_DOCUMENT_FRAGMENT_NODE, '#document-fragment', null, this);\r\n }\r\n\r\n createTextNode(value: any) {\r\n return XNode.create(DOM_TEXT_NODE, '#text', value, this);\r\n }\r\n\r\n createAttribute(name: any) {\r\n return XNode.create(DOM_ATTRIBUTE_NODE, name, null, this);\r\n }\r\n\r\n createAttributeNS(namespace: any, name: any) {\r\n return XNode.create(DOM_ATTRIBUTE_NODE, name, null, this, namespace);\r\n }\r\n\r\n createComment(data: any) {\r\n return XNode.create(DOM_COMMENT_NODE, '#comment', data, this);\r\n }\r\n\r\n createCDATASection(data: any) {\r\n return XNode.create(DOM_CDATA_SECTION_NODE, '#cdata-section', data, this);\r\n }\r\n\r\n createDTDSection(data: any) {\r\n return XNode.create(DOM_DOCUMENT_TYPE_NODE, '#dtd-section', data, this);\r\n }\r\n}\r\n","import he from 'he';\r\n\r\nimport {\r\n DOM_ATTRIBUTE_NODE,\r\n DOM_CDATA_SECTION_NODE,\r\n DOM_COMMENT_NODE,\r\n DOM_DOCUMENT_FRAGMENT_NODE,\r\n DOM_DOCUMENT_NODE,\r\n DOM_DOCUMENT_TYPE_NODE,\r\n DOM_ELEMENT_NODE,\r\n DOM_TEXT_NODE\r\n} from '../constants';\r\nimport { domGetAttributeValue } from './functions';\r\nimport { XNode } from './xnode';\r\nimport { XDocument } from './xdocument';\r\nimport { XmlOutputOptions } from './xml-output-options';\r\nimport { XBrowserNode } from './xbrowser-node';\r\n\r\n/**\r\n * Returns the text value of a node; for nodes without children this\r\n * is the nodeValue, for nodes with children this is the concatenation\r\n * of the value of all children. Browser-specific optimizations are used by\r\n * default; they can be disabled by passing \"true\" in as the second parameter.\r\n * @param node The Node (not exactly a `XNode` here).\r\n * @param disallowBrowserSpecificOptimization A boolean, to avoid browser optimization.\r\n * @returns The XML value as a string.\r\n */\r\nexport function xmlValue(node: XNode, disallowBrowserSpecificOptimization: boolean = false): string {\r\n if (!node) {\r\n return '';\r\n }\r\n\r\n let ret = '';\r\n switch (node.nodeType) {\r\n case DOM_DOCUMENT_TYPE_NODE:\r\n return `<!DOCTYPE ${node.nodeValue}>`;\r\n case DOM_TEXT_NODE:\r\n case DOM_CDATA_SECTION_NODE:\r\n case DOM_ATTRIBUTE_NODE:\r\n return node.nodeValue;\r\n case DOM_ELEMENT_NODE:\r\n case DOM_DOCUMENT_NODE:\r\n case DOM_DOCUMENT_FRAGMENT_NODE:\r\n if (!disallowBrowserSpecificOptimization) {\r\n // Only returns something if node has either `innerText` or `textContent` (not an XNode).\r\n // IE, Safari, Opera, and friends (`innerText`)\r\n const browserNode = node as XBrowserNode;\r\n const innerText = browserNode.innerText;\r\n if (innerText !== undefined) {\r\n return innerText;\r\n }\r\n // Firefox (`textContent`)\r\n const textContent = browserNode.textContent;\r\n if (textContent !== undefined) {\r\n return textContent;\r\n }\r\n }\r\n\r\n const textNodes = node.childNodes.filter((n: XNode) => n.nodeType !== DOM_ATTRIBUTE_NODE);\r\n for (let i = 0; i < textNodes.length; ++i) {\r\n ret += xmlValue(textNodes[i]);\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n\r\n/**\r\n * The older version to obtain a XML value from a node.\r\n * For now, this form is only used to get text from attribute nodes, \r\n * and it should be removed in future versions.\r\n * @param node The attribute node.\r\n * @param disallowBrowserSpecificOptimization A boolean, to avoid browser optimization.\r\n * @returns The XML value as a string.\r\n */\r\nexport function xmlValueLegacyBehavior(node: XNode, disallowBrowserSpecificOptimization: boolean = false) {\r\n if (!node) {\r\n return '';\r\n }\r\n\r\n let returnedXmlString = '';\r\n switch (node.nodeType) {\r\n case DOM_ATTRIBUTE_NODE:\r\n case DOM_TEXT_NODE:\r\n returnedXmlString += node.nodeValue;\r\n break;\r\n case DOM_CDATA_SECTION_NODE:\r\n returnedXmlString += node.nodeValue;\r\n break;\r\n case DOM_DOCUMENT_NODE:\r\n case DOM_DOCUMENT_FRAGMENT_NODE:\r\n case DOM_ELEMENT_NODE:\r\n if (!disallowBrowserSpecificOptimization) {\r\n // IE, Safari, Opera, and friends\r\n const browserNode = node as XBrowserNode;\r\n const innerText = browserNode.innerText;\r\n if (innerText !== undefined) {\r\n return innerText;\r\n }\r\n // Firefox\r\n const textContent = browserNode.textContent;\r\n if (textContent !== undefined) {\r\n return textContent;\r\n }\r\n }\r\n\r\n const len = node.childNodes.length;\r\n for (let i = 0; i < len; ++i) {\r\n returnedXmlString += xmlValue(node.childNodes[i]);\r\n }\r\n\r\n break;\r\n }\r\n\r\n return returnedXmlString;\r\n}\r\n\r\n/**\r\n * Returns the representation of a node as XML text.\r\n * In general it is not used by XSLT, that uses `xmlTransformedText` instead.\r\n * @param {XNode} node The starting node.\r\n * @param {XmlOutputOptions} options XML output options.\r\n * @returns The XML string.\r\n * @see xmlTransformedText\r\n */\r\nexport function xmlText(\r\n node: XNode,\r\n options: XmlOutputOptions = {\r\n cData: true,\r\n escape: true,\r\n selfClosingTags: true,\r\n outputMethod: 'xml'\r\n }\r\n) {\r\n const buffer: string[] = [];\r\n xmlTextRecursive(node, buffer, options);\r\n return buffer.join('');\r\n}\r\n\r\n/**\r\n * The recursive logic to transform a node in XML text.\r\n * It can be considered legacy, since it does not work with transformed nodes, and\r\n * probably will be removed in the future.\r\n * @param {XNode} node The node.\r\n * @param {string[]} buffer The buffer, that will represent the transformed XML text.\r\n * @param {XmlOutputOptions} options XML output options.\r\n */\r\nfunction xmlTextRecursive(node: XNode, buffer: string[], options: XmlOutputOptions) {\r\n if (node.nodeType == DOM_TEXT_NODE) {\r\n buffer.push(xmlEscapeText(node.nodeValue));\r\n } else if (node.nodeType == DOM_CDATA_SECTION_NODE) {\r\n if (options.cData) {\r\n buffer.push(node.nodeValue);\r\n } else {\r\n buffer.push(`<![CDATA[${node.nodeValue}]]>`);\r\n }\r\n } else if (node.nodeType == DOM_COMMENT_NODE) {\r\n buffer.push(`<!--${node.nodeValue}-->`);\r\n } else if (node.nodeType == DOM_ELEMENT_NODE) {\r\n buffer.push(`<${xmlFullNodeName(node)}`);\r\n\r\n for (let i = 0; i < node.childNodes.length; ++i) {\r\n const childNode = node.childNodes[i];\r\n if (!childNode || childNode.nodeType !== DOM_ATTRIBUTE_NODE) {\r\n continue;\r\n }\r\n\r\n if (childNode.nodeName && childNode.nodeValue) {\r\n buffer.push(` ${xmlFullNodeName(childNode)}=\"${xmlEscapeAttr(childNode.nodeValue)}\"`);\r\n }\r\n }\r\n\r\n if (node.childNodes.length === 0) {\r\n if (\r\n options.selfClosingTags ||\r\n (options.outputMethod === 'html' && ['hr', 'link'].includes(node.nodeName))\r\n ) {\r\n buffer.push('/>');\r\n } else {\r\n buffer.push(`></${xmlFullNodeName(node)}>`);\r\n }\r\n } else {\r\n buffer.push('>');\r\n for (let i = 0; i < node.childNodes.length; ++i) {\r\n xmlTextRecursive(node.childNodes[i], buffer, options);\r\n }\r\n buffer.push(`</${xmlFullNodeName(node)}>`);\r\n }\r\n } else if (node.nodeType == DOM_DOCUMENT_NODE || node.nodeType == DOM_DOCUMENT_FRAGMENT_NODE) {\r\n for (let i = 0; i < node.childNodes.length; ++i) {\r\n xmlTextRecursive(node.childNodes[i], buffer, options);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Returns the representation of a node as XML text.\r\n * @param {XNode} node The starting node.\r\n * @param {XmlOutputOptions} options XML output options.\r\n * @returns The XML string.\r\n */\r\nexport function xmlTransformedText(\r\n node: XNode,\r\n options: XmlOutputOptions = {\r\n cData: true,\r\n escape: true,\r\n selfClosingTags: true,\r\n outputMethod: 'xml'\r\n }\r\n) {\r\n const buffer: string[] = [];\r\n xmlTransformedTextRecursive(node, buffer, options);\r\n return buffer.join('');\r\n}\r\n\r\n/**\r\n * The recursive logic to transform a node in XML text.\r\n * @param {XNode} node The node.\r\n * @param {string[]} buffer The buffer, that will represent the transformed XML text.\r\n * @param {XmlOutputOptions} options XML output options.\r\n */\r\nfunction xmlTransformedTextRecursive(node: XNode, buffer: string[], options: XmlOutputOptions) {\r\n if (node.visited) return;\r\n const nodeType = node.nodeType\r\n const nodeValue = node.nodeValue;\r\n if (nodeType === DOM_TEXT_NODE) {\r\n if (node.nodeValue && node.nodeValue.trim() !== '') {\r\n const finalText =\r\n node.escape && options.escape ? xmlEscapeText(node.nodeValue): xmlUnescapeText(node.nodeValue);\r\n buffer.push(finalText);\r\n }\r\n } else if (nodeType === DOM_CDATA_SECTION_NODE) {\r\n if (options.cData) {\r\n buffer.push(xmlEscapeText(nodeValue));\r\n } else {\r\n buffer.push(`<![CDATA[${nodeValue}]]>`);\r\n }\r\n } else if (nodeType == DOM_COMMENT_NODE) {\r\n buffer.push(`<!-- ${nodeValue} -->`);\r\n } else if (nodeType == DOM_ELEMENT_NODE) {\r\n // If node didn't have a transformed name, but its children\r\n // had transformations, children should be present at output.\r\n // This is called here \"muted logic\".\r\n if (node.nodeName !== null && node.nodeName !== undefined) {\r\n xmlElementLogicTrivial(node, buffer, options);\r\n } else {\r\n xmlElementLogicMuted(node, buffer, options);\r\n }\r\n } else if (nodeType === DOM_DOCUMENT_NODE || nodeType === DOM_DOCUMENT_FRAGMENT_NODE) {\r\n let childNodes = node.firstChild ? [] : node.childNodes;\r\n if (node.firstChild) {\r\n let child = node.firstChild;\r\n while (child) {\r\n childNodes.push(child);\r\n child = child.nextSibling;\r\n }\r\n }\r\n childNodes.sort((a, b) => a.siblingPosition - b.siblingPosition);\r\n\r\n for (let i = 0; i < childNodes.length; ++i) {\r\n xmlTransformedTextRecursive(childNodes[i], buffer, options);\r\n }\r\n }\r\n\r\n node.visited = true;\r\n}\r\n\r\n/**\r\n * XML element output, trivial logic.\r\n * @param node The XML node.\r\n * @param buffer The XML buffer.\r\n * @param cdata If using CDATA configuration.\r\n */\r\nfunction xmlElementLogicTrivial(node: XNode, buffer: string[], options: XmlOutputOptions) {\r\n buffer.push(`<${xmlFullNodeName(node)}`);\r\n\r\n let attributes: XNode[] = [];\r\n if (node.firstChild) {\r\n let child = node.firstChild;\r\n while (child) {\r\n if (child.nodeType === DOM_ATTRIBUTE_NODE) {\r\n attributes.push(child);\r\n }\r\n child = child.nextSibling;\r\n }\r\n }\r\n if (attributes.length === 0) {\r\n attributes = node.childNodes.filter((n) => n.nodeType === DOM_ATTRIBUTE_NODE);\r\n }\r\n\r\n for (let i = 0; i < attributes.length; ++i) {\r\n const attribute = attributes[i];\r\n if (!attribute) {\r\n continue;\r\n }\r\n\r\n if (attribute.nodeName && attribute.nodeValue) {\r\n buffer.push(` ${xmlFullNodeName(attribute)}=\"${xmlEscapeAttr(attribute.nodeValue)}\"`);\r\n }\r\n }\r\n\r\n let childNodes: XNode[] = [];\r\n if (node.firstChild) {\r\n let child = node.firstChild;\r\n while (child) {\r\n if (child.nodeType !== DOM_ATTRIBUTE_NODE) {\r\n childNodes.push(child);\r\n }\r\n child = child.nextSibling;\r\n }\r\n }\r\n if (childNodes.length === 0) {\r\n childNodes = node.childNodes.filter((n) => n.nodeType !== DOM_ATTRIBUTE_NODE);\r\n }\r\n\r\n childNodes = childNodes.sort((a, b) => a.siblingPosition - b.siblingPosition);\r\n if (childNodes.length === 0) {\r\n if (options.outputMethod === 'html' && ['hr', 'link', 'meta'].includes(node.nodeName)) {\r\n buffer.push('>');\r\n } else if (options.selfClosingTags) {\r\n buffer.push('/>');\r\n } else {\r\n buffer.push(`></${xmlFullNodeName(node)}>`);\r\n }\r\n } else {\r\n buffer.push('>');\r\n for (let i = 0; i < childNodes.length; ++i) {\r\n xmlTransformedTextRecursive(childNodes[i], buffer, options);\r\n }\r\n buffer.push(`</${xmlFullNodeName(node)}>`);\r\n }\r\n}\r\n\r\n/**\r\n * XML element output, muted logic.\r\n * In other words, this element should not be printed, but its\r\n * children can be printed if they have transformed values.\r\n * @param node The XML node.\r\n * @param buffer The XML buffer.\r\n * @param cdata If using CDATA configuration.\r\n */\r\nfunction xmlElementLogicMuted(node: XNode, buffer: any[], options: XmlOutputOptions) {\r\n let childNodes: XNode[] = [];\r\n if (node.firstChild) {\r\n let child = node.firstChild;\r\n while (child) {\r\n childNodes.push(child);\r\n child = child.nextSibling;\r\n }\r\n } else {\r\n childNodes = node.childNodes;\r\n }\r\n childNodes = childNodes.sort((a, b) => a.siblingPosition - b.siblingPosition);\r\n for (let i = 0; i < childNodes.length; ++i) {\r\n xmlTransformedTextRecursive(childNodes[i], buffer, options);\r\n }\r\n}\r\n\r\n/**\r\n * Gets the full node name.\r\n * When namespace is set, the node name is `namespace:node`.\r\n * @param node The node.\r\n * @returns The full node name as a string.\r\n */\r\nfunction xmlFullNodeName(node: XNode): string {\r\n const nodeName = node.nodeName;\r\n if (node.prefix && nodeName.indexOf(`${node.prefix}:`) != 0) {\r\n return `${node.prefix}:${nodeName}`;\r\n }\r\n\r\n return nodeName;\r\n}\r\n\r\n/**\r\n * Replaces HTML/XML entities to their literal characters.\r\n * Currently implementing only tag delimiters.\r\n * @param text The text to be transformed.\r\n * @returns The unescaped text.\r\n */\r\nexport function xmlUnescapeText(text: string): string {\r\n return `${text}`.replace(/&lt;/g, '<').replace(/&gt;/g, '>');\r\n}\r\n\r\n/**\r\n * Escape XML special markup characters: tag delimiter <, >, and entity\r\n * reference start delimiter &. The escaped string can be used in XML\r\n * text portions (i.e. between tags).\r\n * @param s The string to be escaped.\r\n * @returns The escaped string.\r\n */\r\nexport function xmlEscapeText(s: string): string {\r\n return `${s}`\r\n .replace(/&/g, '&amp;')\r\n .replace(/&amp;amp;/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;');\r\n}\r\n\r\n/**\r\n * Escape XML special markup characters: tag delimiter, <, >, entity\r\n * reference start delimiter &, and double quotes (\"). The escaped string can be\r\n * used in double quoted XML attribute value portions (i.e. in\r\n * attributes within start tags).\r\n * @param s The string to be escaped.\r\n * @returns The escaped string.\r\n */\r\nfunction xmlEscapeAttr(s: string): string {\r\n return xmlEscapeText(s).replace(/\"/g, '&quot;');\r\n}\r\n\r\n/**\r\n * Wrapper function to access attribute values of template element\r\n * nodes. Currently this calls he.decode because in some DOM\r\n * implementations the return value of node.getAttributeValue()\r\n * contains unresolved XML entities, although the DOM spec requires\r\n * that entity references are resolved by the DOM.\r\n * @param node TODO\r\n * @param name TODO\r\n * @returns TODO\r\n */\r\nexport function xmlGetAttribute(node: XNode, name: string): string {\r\n // TODO(mesch): This should not be necessary if the DOM is working\r\n // correctly. The DOM is responsible for resolving entities, not the\r\n // application.\r\n const value = domGetAttributeValue(node, name);\r\n if (value) {\r\n return he.decode(value);\r\n }\r\n\r\n return value;\r\n}\r\n\r\n/**\r\n * Wrapper function to access the owner document uniformly for document\r\n * and other nodes: for the document node, the owner document is the\r\n * node itself, for all others it's the ownerDocument property.\r\n *\r\n * @param {XNode} node\r\n * @return {XDocument}\r\n */\r\nexport function xmlOwnerDocument(node: XNode): XDocument {\r\n if (node === null || node === undefined) {\r\n throw new Error('Node has no valid owner document.');\r\n }\r\n\r\n if (node.nodeType === DOM_DOCUMENT_NODE) {\r\n return node as XDocument;\r\n }\r\n\r\n return xmlOwnerDocument(node.ownerDocument);\r\n}\r\n","import he from 'he';\r\nimport {\r\n domCreateElement,\r\n domSetAttribute,\r\n domAppendChild,\r\n domCreateTextNode,\r\n domCreateComment,\r\n domCreateCDATASection,\r\n domCreateDTDSection\r\n} from './functions';\r\n\r\nimport { XDocument } from './xdocument';\r\nimport {\r\n XML10_ATTRIBUTE,\r\n XML10_NAME,\r\n XML10_VERSION_INFO,\r\n XML11_ATTRIBUTE,\r\n XML11_NAME,\r\n XML11_VERSION_INFO\r\n} from './xmltoken';\r\nimport { XNode } from './xnode';\r\nimport { DOM_ATTRIBUTE_NODE } from '../constants';\r\n\r\n/**\r\n * Original author: Steffen Meschkat <mesch@google.com> (the `xmlParse` function,\r\n * now `xmlStrictParse`).\r\n *\r\n * An XML parse and a minimal DOM implementation that just supports\r\n * the subset of the W3C DOM that is used in the XSLT implementation.\r\n */\r\nexport class XmlParser {\r\n regexEmpty = /\\/$/;\r\n\r\n XML10_TAGNAME_REGEXP = new RegExp(`^(${XML10_NAME})`);\r\n XML10_ATTRIBUTE_REGEXP = new RegExp(XML10_ATTRIBUTE, 'g');\r\n\r\n XML11_TAGNAME_REGEXP = new RegExp(`^(${XML11_NAME})`);\r\n XML11_ATTRIBUTE_REGEXP = new RegExp(XML11_ATTRIBUTE, 'g');\r\n\r\n lenientHtmlTags = ['hr', 'link', 'meta'];\r\n\r\n /**\r\n * The entry point for this parser.\r\n * It verifies whether the document seems to be HTML.\r\n * HTML is a special case if XML and it should be parsed differently.\r\n * @param xmlOrHtml The XML or HTML content to be parsed.\r\n * @returns A DOM document.\r\n */\r\n xmlParse(xmlOrHtml: string): XDocument {\r\n if (xmlOrHtml.toUpperCase().startsWith('<!DOCTYPE HTML')) {\r\n return this.htmlParse(xmlOrHtml);\r\n }\r\n\r\n return this.xmlStrictParse(xmlOrHtml);\r\n }\r\n\r\n /**\r\n * Given an XNode, returns an object mapping prefixes to their corresponding namespaces in its scope.\r\n * Default namespace is treated as if its prefix were the empty string.\r\n * @param node The Node.\r\n * @returns An object with prefixes and namespace URLs.\r\n */\r\n private namespaceMapAt(node: XNode): { [prefix: string]: string } {\r\n const map = {\r\n // reserved namespaces: https://www.w3.org/TR/REC-xml-names/#xmlReserved\r\n xmlns: 'http://www.w3.org/2000/xmlns/',\r\n xml: 'http://www.w3.org/XML/1998/namespace'\r\n };\r\n let n = node;\r\n while (n !== null) {\r\n for (let i = 0; i < n.childNodes.length; i++) {\r\n const childNode = n.childNodes[i];\r\n if (childNode.nodeType !== DOM_ATTRIBUTE_NODE) {\r\n continue;\r\n }\r\n\r\n if (childNode.nodeName.startsWith('xmlns:')) {\r\n const prefix = childNode.nodeName.split(':')[1];\r\n if (!(prefix in map)) map[prefix] = childNode.nodeValue;\r\n } else if (childNode.nodeName == 'xmlns') {\r\n if (!('' in map)) map[''] = childNode.nodeValue || null;\r\n }\r\n }\r\n n = n.parentNode;\r\n }\r\n return map;\r\n }\r\n\r\n /**\r\n * HTML needs to be parsed differently because it's a special case of XML.\r\n * Sources:\r\n *\r\n * - https://blog.teamtreehouse.com/to-close-or-not-to-close-tags-in-html5\r\n * @param htmlText The HTML text\r\n * @returns A DOM document.\r\n */\r\n private htmlParse(htmlText: string): XDocument {\r\n const xmlDocument = new XDocument();\r\n const root = xmlDocument;\r\n const stack = [];\r\n\r\n let parent: XNode = root;\r\n stack.push(parent);\r\n\r\n let tag = false,\r\n quotes = false,\r\n doublequotes = false,\r\n start = 0;\r\n for (let i = 0; i < htmlText.length; ++i) {\r\n let char = htmlText.charAt(i);\r\n\r\n if (tag) {\r\n if (!doublequotes && char === \"'\") {\r\n quotes = !quotes;\r\n } else if (!quotes && char === '\"') {\r\n doublequotes = !doublequotes;\r\n } else if (!quotes && !doublequotes && char === '>') {\r\n let text = htmlText.slice(start, i);\r\n\r\n if (text.charAt(0) === '/') { // {\r\n stack.pop();\r\n parent = stack[stack.length - 1];\r\n } else if (text.charAt(0) === '!') {\r\n // Ignore comments\r\n // console.log(`Ignored ${text}`);\r\n } else {\r\n const empty = text.match(this.regexEmpty);\r\n const tagName = this.XML10_TAGNAME_REGEXP.exec(text)[1];\r\n let node = domCreateElement(xmlDocument, tagName);\r\n\r\n let attribute;\r\n while ((attribute = this.XML10_ATTRIBUTE_REGEXP.exec(text))) {\r\n const val = he.decode(attribute[5] || attribute[7] || '');\r\n domSetAttribute(node, attribute[1], val);\r\n }\r\n\r\n node.siblingPosition = parent.childNodes.length;\r\n domAppendChild(parent, node);\r\n\r\n // The fundamental difference between this parse function\r\n // and the strict XML parse is here:\r\n // HTML is lenient with certain tags, that don't need to be closed.\r\n if (!empty && !this.lenientHtmlTags.includes(tagName)) {\r\n parent = node;\r\n stack.push(node);\r\n }\r\n }\r\n\r\n start = i + 1;\r\n tag = false;\r\n quotes = false;\r\n doublequotes = false;\r\n }\r\n } else {\r\n if (char === '<') {\r\n let text = htmlText.slice(start, i);\r\n if (text && parent !== root) {\r\n domAppendChild(parent, domCreateTextNode(xmlDocument, text));\r\n }\r\n if (htmlText.slice(i + 1, i + 4) === '!--') {\r\n let endTagIndex = htmlText.slice(i + 4).indexOf('-->');\r\n if (endTagIndex) {\r\n let node = domCreateComment(xmlDocument, htmlText.slice(i + 4, i + endTagIndex + 4));\r\n domAppendChild(parent, node);\r\n i += endTagIndex + 6;\r\n }\r\n } else if (htmlText.slice(i + 1, i + 9) === '!DOCTYPE') {\r\n let endTagIndex = htmlText.slice(i + 9).indexOf('>');\r\n if (endTagIndex) {\r\n const dtdValue = htmlText.slice(i + 9, i + endTagIndex + 9).trimStart();\r\n // TODO: Not sure if this is a good solution.\r\n // Trying to implement this: https://github.com/DesignLiquido/xslt-processor/issues/30\r\n const node = domCreateDTDSection(xmlDocument, dtdValue);\r\n domAppendChild(parent, node);\r\n i += endTagIndex + dtdValue.length + 5;\r\n }\r\n } else {\r\n tag = true;\r\n }\r\n start = i + 1;\r\n }\r\n }\r\n }\r\n\r\n return xmlDocument;\r\n }\r\n\r\n /**\r\n * Parses the given XML string with our custom, JavaScript XML parser.\r\n * @param xml The XML String.\r\n * @returns A XDocument.\r\n * @author Steffen Meschkat <mesch@google.com>\r\n */\r\n private xmlStrictParse(xml: string): XDocument {\r\n let regexTagname: RegExp;\r\n let regexAttribute: RegExp;\r\n if (xml.match(/^<\\?xml/)) {\r\n // When an XML document begins with an XML declaration\r\n // VersionInfo must appear.\r\n if (xml.search(new RegExp(XML10_VERSION_INFO)) === 5) {\r\n regexTagname = this.XML10_TAGNAME_REGEXP;\r\n regexAttribute = this.XML10_ATTRIBUTE_REGEXP;\r\n } else if (xml.search(new RegExp(XML11_VERSION_INFO)) === 5) {\r\n regexTagname = this.XML11_TAGNAME_REGEXP;\r\n regexAttribute = this.XML11_ATTRIBUTE_REGEXP;\r\n } else {\r\n throw new Error('XML VersionInfo has an unknown version number.');\r\n }\r\n } else {\r\n // When an XML declaration is missing it's an XML 1.0 document.\r\n regexTagname = this.XML10_TAGNAME_REGEXP;\r\n regexAttribute = this.XML10_ATTRIBUTE_REGEXP;\r\n }\r\n\r\n const xmlDocument = new XDocument();\r\n const root = xmlDocument;\r\n const stack = [];\r\n\r\n let parent: XNode = root;\r\n stack.push(parent);\r\n\r\n let tag = false,\r\n quotes = false,\r\n doublequotes = false,\r\n start = 0;\r\n for (let i = 0; i < xml.length; ++i) {\r\n let char = xml.charAt(i);\r\n if (tag && !doublequotes && char === \"'\") {\r\n quotes = !quotes;\r\n } else if (tag && !quotes && char === '\"') {\r\n doublequotes = !doublequotes;\r\n } else if (tag && char === '>' && !quotes && !doublequotes) {\r\n let text = xml.slice(start, i);\r\n if (text.charAt(0) === '/') {\r\n stack.pop();\r\n parent = stack[stack.length - 1];\r\n } else if (text.charAt(0) === '?') {\r\n // Ignore XML declaration and processing instructions\r\n } else if (text.charAt(0) === '!') {\r\n // Ignore comments\r\n // console.log(`Ignored ${text}`);\r\n } else {\r\n const empty = text.match(this.regexEmpty);\r\n const tagname = regexTagname.exec(text)[1];\r\n let node = domCreateElement(xmlDocument, tagname);\r\n\r\n let attribute;\r\n while ((attribute = regexAttribute.exec(text))) {\r\n const val = he.decode(attribute[5] || attribute[7] || '');\r\n domSetAttribute(node, attribute[1], val);\r\n }\r\n\r\n node.siblingPosition = parent.childNodes.length;\r\n domAppendChild(parent, node);\r\n if (!empty) {\r\n parent = node;\r\n stack.push(node);\r\n }\r\n\r\n const namespaceMap = this.namespaceMapAt(node);\r\n if (node.prefix !== null) {\r\n if (node.prefix in namespaceMap) node.namespaceUri = namespaceMap[node.prefix];\r\n // else, prefix is undefined. do anything?\r\n } else {\r\n if ('' in namespaceMap) node.namespaceUri = namespaceMap[''];\r\n }\r\n\r\n for (let i = 0; i < node.childNodes.length; ++i) {\r\n const childNode = node.childNodes[i];\r\n if (childNode.nodeType !== DOM_ATTRIBUTE_NODE) {\r\n continue;\r\n }\r\n\r\n if (childNode.prefix !== null && childNode.prefix in namespaceMap) {\r\n childNode.namespaceUri = namespaceMap[childNode.prefix];\r\n // else, prefix undefined.\r\n }\r\n // elements with no prefix always have no namespace, so do nothing here.\r\n }\r\n }\r\n start = i + 1;\r\n tag = false;\r\n quotes = false;\r\n doublequotes = false;\r\n } else if (!tag && char === '<') {\r\n let text = xml.slice(start, i);\r\n if (text && parent !== root) {\r\n domAppendChild(parent, domCreateTextNode(xmlDocument, text));\r\n }\r\n if (xml.slice(i + 1, i + 4) === '!--') {\r\n let endTagIndex = xml.slice(i + 4).indexOf('-->');\r\n if (endTagIndex) {\r\n let node = domCreateComment(xmlDocument, xml.slice(i + 4, i + endTagIndex + 4));\r\n domAppendChild(parent, node);\r\n i += endTagIndex + 6;\r\n }\r\n } else if (xml.slice(i + 1, i + 9) === '![CDATA[') {\r\n let endTagIndex = xml.slice(i + 9).indexOf(']]>');\r\n if (endTagIndex) {\r\n let node = domCreateCDATASection(xmlDocument, xml.slice(i + 9, i + endTagIndex + 9));\r\n domAppendChild(parent, node);\r\n i += endTagIndex + 11;\r\n }\r\n } else if (xml.slice(i + 1, i + 9) === '!DOCTYPE') { // \"!DOCTYPE\" can be used in a XSLT template.\r\n let endTagIndex = xml.slice(i + 9).indexOf('>');\r\n if (endTagIndex) {\r\n const dtdValue = xml.slice(i + 9, i + endTagIndex + 9).trimStart();\r\n // TODO: Not sure if this is a good solution.\r\n // Trying to implement this: https://github.com/DesignLiquido/xslt-processor/issues/30\r\n const node = domCreateDTDSection(xmlDocument, dtdValue);\r\n domAppendChild(parent, node);\r\n i += endTagIndex + dtdValue.length + 5;\r\n }\r\n } else {\r\n tag = true;\r\n }\r\n start = i + 1;\r\n }\r\n }\r\n\r\n return root;\r\n }\r\n}\r\n","// Copyright 2023-2024 Design Liquido\r\n// Copyright 2018 Johannes Wilm\r\n// Copyright 2006 Google Inc.\r\n// All Rights Reserved\r\n//\r\n// Defines regular expression patterns to extract XML tokens from string.\r\n// See <http://www.w3.org/TR/REC-xml/#sec-common-syn>,\r\n// <http://www.w3.org/TR/xml11/#sec-common-syn> and\r\n// <http://www.w3.org/TR/REC-xml-names/#NT-NCName> for the specifications.\r\n//\r\n// Original author: Junji Takagi <jtakagi@google.com>\r\n\r\n// Common tokens in XML 1.0 and XML 1.1.\r\n\r\nconst XML_S = '[ \\t\\r\\n]+';\r\nconst XML_EQ = `(${XML_S})?=(${XML_S})?`;\r\nexport const XML_CHAR_REF = '&#[0-9]+;|&#x[0-9a-fA-F]+;';\r\n\r\n// XML 1.0 tokens.\r\n\r\nexport const XML10_VERSION_INFO = `${XML_S}version${XML_EQ}(\"1\\\\.0\"|'1\\\\.0')`;\r\nconst XML10_BASE_CHAR =\r\n '\\u0041-\\u005a\\u0061-\\u007a\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff' +\r\n '\\u0100-\\u0131\\u0134-\\u013e\\u0141-\\u0148\\u014a-\\u017e\\u0180-\\u01c3' +\r\n '\\u01cd-\\u01f0\\u01f4-\\u01f5\\u01fa-\\u0217\\u0250-\\u02a8\\u02bb-\\u02c1\\u0386' +\r\n '\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03ce\\u03d0-\\u03d6\\u03da\\u03dc' +\r\n '\\u03de\\u03e0\\u03e2-\\u03f3\\u0401-\\u040c\\u040e-\\u044f\\u0451-\\u045c' +\r\n '\\u045e-\\u0481\\u0490-\\u04c4\\u04c7-\\u04c8\\u04cb-\\u04cc\\u04d0-\\u04eb' +\r\n '\\u04ee-\\u04f5\\u04f8-\\u04f9\\u0531-\\u0556\\u0559\\u0561-\\u0586\\u05d0-\\u05ea' +\r\n '\\u05f0-\\u05f2\\u0621-\\u063a\\u0641-\\u064a\\u0671-\\u06b7\\u06ba-\\u06be' +\r\n '\\u06c0-\\u06ce\\u06d0-\\u06d3\\u06d5\\u06e5-\\u06e6\\u0905-\\u0939\\u093d' +\r\n '\\u0958-\\u0961\\u0985-\\u098c\\u098f-\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2' +\r\n '\\u09b6-\\u09b9\\u09dc-\\u09dd\\u09df-\\u09e1\\u09f0-\\u09f1\\u0a05-\\u0a0a' +\r\n '\\u0a0f-\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32-\\u0a33\\u0a35-\\u0a36' +\r\n '\\u0a38-\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8b\\u0a8d' +\r\n '\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2-\\u0ab3\\u0ab5-\\u0ab9' +\r\n '\\u0abd\\u0ae0\\u0b05-\\u0b0c\\u0b0f-\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30' +\r\n '\\u0b32-\\u0b33\\u0b36-\\u0b39\\u0b3d\\u0b5c-\\u0b5d\\u0b5f-\\u0b61\\u0b85-\\u0b8a' +\r\n '\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99-\\u0b9a\\u0b9c\\u0b9e-\\u0b9f\\u0ba3-\\u0ba4' +\r\n '\\u0ba8-\\u0baa\\u0bae-\\u0bb5\\u0bb7-\\u0bb9\\u0c05-\\u0c0c\\u0c0e-\\u0c10' +\r\n '\\u0c12-\\u0c28\\u0c2a-\\u0c33\\u0c35-\\u0c39\\u0c60-\\u0c61\\u0c85-\\u0c8c' +\r\n '\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cde\\u0ce0-\\u0ce1' +\r\n '\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d28\\u0d2a-\\u0d39\\u0d60-\\u0d61' +\r\n '\\u0e01-\\u0e2e\\u0e30\\u0e32-\\u0e33\\u0e40-\\u0e45\\u0e81-\\u0e82\\u0e84' +\r\n '\\u0e87-\\u0e88\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5' +\r\n '\\u0ea7\\u0eaa-\\u0eab\\u0ead-\\u0eae\\u0eb0\\u0eb2-\\u0eb3\\u0ebd\\u0ec0-\\u0ec4' +\r\n '\\u0f40-\\u0f47\\u0f49-\\u0f69\\u10a0-\\u10c5\\u10d0-\\u10f6\\u1100\\u1102-\\u1103' +\r\n '\\u1105-\\u1107\\u1109\\u110b-\\u110c\\u110e-\\u1112\\u113c\\u113e\\u1140\\u114c' +\r\n '\\u114e\\u1150\\u1154-\\u1155\\u1159\\u115f-\\u1161\\u1163\\u1165\\u1167\\u1169' +\r\n '\\u116d-\\u116e\\u1172-\\u1173\\u1175\\u119e\\u11a8\\u11ab\\u11ae-\\u11af' +\r\n '\\u11b7-\\u11b8\\u11ba\\u11bc-\\u11c2\\u11eb\\u11f0\\u11f9\\u1e00-\\u1e9b' +\r\n '\\u1ea0-\\u1ef9\\u1f00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d' +\r\n '\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc' +\r\n '\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec' +\r\n '\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2126\\u212a-\\u212b\\u212e\\u2180-\\u2182' +\r\n '\\u3041-\\u3094\\u30a1-\\u30fa\\u3105-\\u312c\\uac00-\\ud7a3';\r\nconst XML10_IDEOGRAPHIC = '\\u4e00-\\u9fa5\\u3007\\u3021-\\u3029';\r\nconst XML10_COMBINING_CHAR =\r\n '\\u0300-\\u0345\\u0360-\\u0361\\u0483-\\u0486\\u0591-\\u05a1\\u05a3-\\u05b9' +\r\n '\\u05bb-\\u05bd\\u05bf\\u05c1-\\u05c2\\u05c4\\u064b-\\u0652\\u0670\\u06d6-\\u06dc' +\r\n '\\u06dd-\\u06df\\u06e0-\\u06e4\\u06e7-\\u06e8\\u06ea-\\u06ed\\u0901-\\u0903\\u093c' +\r\n '\\u093e-\\u094c\\u094d\\u0951-\\u0954\\u0962-\\u0963\\u0981-\\u0983\\u09bc\\u09be' +\r\n '\\u09bf\\u09c0-\\u09c4\\u09c7-\\u09c8\\u09cb-\\u09cd\\u09d7\\u09e2-\\u09e3\\u0a02' +\r\n '\\u0a3c\\u0a3e\\u0a3f\\u0a40-\\u0a42\\u0a47-\\u0a48\\u0a4b-\\u0a4d\\u0a70-\\u0a71' +\r\n '\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0b01-\\u0b03' +\r\n '\\u0b3c\\u0b3e-\\u0b43\\u0b47-\\u0b48\\u0b4b-\\u0b4d\\u0b56-\\u0b57\\u0b82-\\u0b83' +\r\n '\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0c01-\\u0c03\\u0c3e-\\u0c44' +\r\n '\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55-\\u0c56\\u0c82-\\u0c83\\u0cbe-\\u0cc4' +\r\n '\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5-\\u0cd6\\u0d02-\\u0d03\\u0d3e-\\u0d43' +\r\n '\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1' +\r\n '\\u0eb4-\\u0eb9\\u0ebb-\\u0ebc\\u0ec8-\\u0ecd\\u0f18-\\u0f19\\u0f35\\u0f37\\u0f39' +\r\n '\\u0f3e\\u0f3f\\u0f71-\\u0f84\\u0f86-\\u0f8b\\u0f90-\\u0f95\\u0f97\\u0f99-\\u0fad' +\r\n '\\u0fb1-\\u0fb7\\u0fb9\\u20d0-\\u20dc\\u20e1\\u302a-\\u302f\\u3099\\u309a';\r\nconst XML10_DIGIT =\r\n '\\u0030-\\u0039\\u0660-\\u0669\\u06f0-\\u06f9\\u0966-\\u096f\\u09e6-\\u09ef' +\r\n '\\u0a66-\\u0a6f\\u0ae6-\\u0aef\\u0b66-\\u0b6f\\u0be7-\\u0bef\\u0c66-\\u0c6f' +\r\n '\\u0ce6-\\u0cef\\u0d66-\\u0d6f\\u0e50-\\u0e59\\u0ed0-\\u0ed9\\u0f20-\\u0f29';\r\nconst XML10_EXTENDER = '\\u00b7\\u02d0\\u02d1\\u0387\\u0640\\u0e46\\u0ec6\\u3005\\u3031-\\u3035' + '\\u309d-\\u309e\\u30fc-\\u30fe';\r\nconst XML10_LETTER = XML10_BASE_CHAR + XML10_IDEOGRAPHIC;\r\nconst XML10_NAME_CHAR = `${XML10_LETTER + XML10_DIGIT}\\\\._:${XML10_COMBINING_CHAR}${XML10_EXTENDER}-`;\r\nexport const XML10_NAME = `[${XML10_LETTER}_:][${XML10_NAME_CHAR}]*`;\r\n\r\nexport const XML10_ENTITY_REF = `&${XML10_NAME};`;\r\nconst XML10_REFERENCE = `${XML10_ENTITY_REF}|${XML_CHAR_REF}`;\r\nexport const XML10_ATT_VALUE = `\"(([^<&\"]|${XML10_REFERENCE})*)\"|'(([^<&']|${XML10_REFERENCE})*)'`;\r\nexport const XML10_ATTRIBUTE = `(${XML10_NAME})${XML_EQ}(${XML10_ATT_VALUE})`;\r\n\r\n// XML 1.1 tokens.\r\n// TODO(jtakagi): NameStartChar also includes \\u10000-\\ueffff.\r\n// ECMAScript Language Specifiction defines UnicodeEscapeSequence as\r\n// \"\\u HexDigit HexDigit HexDigit HexDigit\" and we may need to use\r\n// surrogate pairs, but any browser doesn't support surrogate paris in\r\n// character classes of regular expression, so avoid including them for now.\r\n\r\nexport const XML11_VERSION_INFO = `${XML_S}version${XML_EQ}(\"1\\\\.1\"|'1\\\\.1')`;\r\nconst XML11_NAME_START_CHAR =\r\n ':A-Z_a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02ff\\u0370-\\u037d' +\r\n '\\u037f-\\u1fff\\u200c-\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff' +\r\n '\\uf900-\\ufdcf\\ufdf0-\\ufffd';\r\nconst XML11_NAME_CHAR = XML11_NAME_START_CHAR + '\\\\.0-9\\u00b7\\u0300-\\u036f\\u203f-\\u2040-';\r\nexport const XML11_NAME = `[${XML11_NAME_START_CHAR}][${XML11_NAME_CHAR}]*`;\r\n\r\nexport const XML11_ENTITY_REF = `&${XML11_NAME};`;\r\nconst XML11_REFERENCE = `${XML11_ENTITY_REF}|${XML_CHAR_REF}`;\r\nexport const XML11_ATT_VALUE = `\"(([^<&\"]|${XML11_REFERENCE})*)\"|'(([^<&']|${XML11_REFERENCE})*)'`;\r\nexport const XML11_ATTRIBUTE = `(${XML11_NAME})${XML_EQ}(${XML11_ATT_VALUE})`;\r\n\r\n// XML Namespace tokens.\r\n// Used in XML parser and XPath parser.\r\n\r\nconst XML_NC_NAME_CHAR = `${XML10_LETTER + XML10_DIGIT}\\\\._${XML10_COMBINING_CHAR}${XML10_EXTENDER}-`;\r\nexport const XML_NC_NAME = `[${XML10_LETTER}_][${XML_NC_NAME_CHAR}]*`;\r\n","import { XNode, xmlValue } from \"../../dom\";\r\nimport { NodeValue } from \"./node-value\";\r\n\r\nexport class NodeSetValue implements NodeValue {\r\n value: XNode[];\r\n type: string;\r\n\r\n constructor(value: XNode[]) {\r\n this.value = value;\r\n this.type = 'node-set';\r\n }\r\n\r\n stringValue(): string {\r\n if (this.value.length === 0) {\r\n return '';\r\n }\r\n\r\n return xmlValue(this.value[0]);\r\n }\r\n\r\n booleanValue() {\r\n return this.value.length > 0;\r\n }\r\n\r\n numberValue() {\r\n return parseInt(this.stringValue()) - 0;\r\n }\r\n\r\n nodeSetValue(): XNode[] {\r\n return this.value;\r\n }\r\n}\r\n","// Copyright 2023-2024 Design Liquido\r\n// XPath adapter that uses the new lexer/parser implementation\r\n// while maintaining backward compatibility with the existing XSLT API.\r\n\r\nimport { XNode } from '../dom';\r\nimport { XPathLexer } from './lib/src/lexer';\r\nimport { XPathParser } from './lib/src/parser';\r\nimport { XPathExpression, XPathLocationPath, XPathUnionExpression } from './lib/src/expressions';\r\nimport { XPathContext, XPathResult, createContext } from './lib/src/context';\r\nimport { XPathNode } from './lib/src/node';\r\nimport { ExprContext } from './expr-context';\r\nimport { NodeValue, StringValue, NumberValue, BooleanValue, NodeSetValue } from './values';\r\n\r\n/**\r\n * Expression wrapper that provides backward-compatible interface.\r\n * Wraps new XPath expressions to work with old ExprContext.\r\n */\r\nexport class Expression {\r\n protected xpathExpression: XPathExpression;\r\n protected nodeConverter: NodeConverter;\r\n\r\n // Properties for LocationPath compatibility\r\n absolute?: boolean;\r\n steps?: any[];\r\n\r\n constructor(xpathExpression: XPathExpression, nodeConverter: NodeConverter) {\r\n this.xpathExpression = xpathExpression;\r\n this.nodeConverter = nodeConverter;\r\n\r\n // Extract properties if this is a location path\r\n if (xpathExpression instanceof XPathLocationPath) {\r\n this.absolute = xpathExpression.absolute;\r\n this.steps = xpathExpression.steps.map((step, index) => ({\r\n axis: step.axis,\r\n nodeTest: step.nodeTest,\r\n predicates: step.predicates,\r\n // Add methods needed by old code\r\n hasPositionalPredicate: false, // TODO: implement proper detection\r\n predicate: step.predicates || [],\r\n evaluate: (ctx: ExprContext) => {\r\n // Evaluate just this step\r\n const xpathCtx = this.nodeConverter.exprContextToXPathContext(ctx);\r\n const result = step.evaluate(xpathCtx);\r\n return this.nodeConverter.wrapResult(result, ctx);\r\n }\r\n }));\r\n }\r\n }\r\n\r\n /**\r\n * Evaluate the expression in the given context.\r\n */\r\n evaluate(context: ExprContext): NodeValue {\r\n const xpathContext = this.nodeConverter.exprContextToXPathContext(context);\r\n const result = this.xpathExpression.evaluate(xpathContext);\r\n return this.nodeConverter.wrapResult(result, context);\r\n }\r\n}\r\n\r\n/**\r\n * Location expression wrapper for XSLT pattern matching.\r\n */\r\nexport class LocationExpr extends Expression {\r\n declare absolute: boolean;\r\n declare steps: any[];\r\n\r\n constructor(xpathExpression: XPathLocationPath, nodeConverter: NodeConverter) {\r\n super(xpathExpression, nodeConverter);\r\n this.absolute = xpathExpression.absolute;\r\n this.steps = xpathExpression.steps.map(step => ({\r\n axis: step.axis,\r\n nodeTest: step.nodeTest,\r\n predicates: step.predicates || [],\r\n predicate: step.predicates || [],\r\n hasPositionalPredicate: this.hasPositionalPredicate(step.predicates || []),\r\n }));\r\n }\r\n\r\n private hasPositionalPredicate(predicates: XPathExpression[]): boolean {\r\n // TODO: Implement proper detection of positional predicates\r\n // For now, assume no positional predicates\r\n return false;\r\n }\r\n\r\n appendStep(step: any) {\r\n this.steps.push(step);\r\n }\r\n\r\n prependStep(step: any) {\r\n this.steps.unshift(step);\r\n }\r\n}\r\n\r\n/**\r\n * Union expression wrapper.\r\n */\r\nexport class UnionExpr extends Expression {\r\n expr1: Expression;\r\n expr2: Expression;\r\n\r\n constructor(\r\n xpathExpression: XPathUnionExpression,\r\n nodeConverter: NodeConverter,\r\n expr1: Expression,\r\n expr2: Expression\r\n ) {\r\n super(xpathExpression, nodeConverter);\r\n this.expr1 = expr1;\r\n this.expr2 = expr2;\r\n }\r\n}\r\n\r\n/**\r\n * Handles conversion between ExprContext and XPathContext.\r\n * Uses XNode directly as XPathNode-compatible objects to preserve node identity.\r\n */\r\nclass NodeConverter {\r\n /**\r\n * Convert ExprContext to XPathContext for the new XPath implementation.\r\n * XNodes are used directly since they implement enough of the XPathNode interface.\r\n */\r\n exprContextToXPathContext(exprContext: ExprContext): XPathContext {\r\n const currentNode = exprContext.nodeList[exprContext.position];\r\n // Use XNode directly - it's compatible enough with XPathNode\r\n const xpathNode = this.adaptXNode(currentNode);\r\n\r\n // Convert all nodes in the node list (needed for 'self-and-siblings' axis)\r\n const nodeList = exprContext.nodeList.map(node => this.adaptXNode(node));\r\n\r\n return createContext(xpathNode, {\r\n position: exprContext.position + 1, // XPath is 1-based\r\n size: exprContext.nodeList.length,\r\n nodeList: nodeList,\r\n variables: this.convertVariables(exprContext),\r\n functions: this.createCustomFunctions(exprContext),\r\n namespaces: exprContext.knownNamespaces,\r\n });\r\n }\r\n\r\n /**\r\n * Adapt XNode to be compatible with XPathNode interface.\r\n * We add missing properties but keep the original XNode reference.\r\n */\r\n adaptXNode(node: XNode): XPathNode {\r\n if (!node) return null;\r\n\r\n // XNode already has most properties, we just need to handle some differences\r\n // We add adapter properties without modifying the original object\r\n const adapted = node as any;\r\n\r\n // Add XPathNode-compatible properties if not present\r\n if (!('namespaceURI' in adapted)) {\r\n Object.defineProperty(adapted, 'namespaceURI', {\r\n get() { return this.namespaceUri; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n }\r\n\r\n if (!('textContent' in adapted)) {\r\n Object.defineProperty(adapted, 'textContent', {\r\n get() { return this._getTextContent(); },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n }\r\n\r\n if (!('_getTextContent' in adapted)) {\r\n adapted._getTextContent = function() {\r\n if (this.nodeType === 3 || this.nodeType === 2) { // TEXT_NODE or ATTRIBUTE_NODE\r\n return this.nodeValue || '';\r\n }\r\n if (!this.childNodes) return '';\r\n let text = '';\r\n for (const child of this.childNodes) {\r\n if (child.nodeType === 3) {\r\n text += child.nodeValue || '';\r\n } else if (child.nodeType === 1) {\r\n text += this._getTextContent.call(child);\r\n }\r\n }\r\n return text;\r\n };\r\n }\r\n\r\n if (!('attributes' in adapted)) {\r\n Object.defineProperty(adapted, 'attributes', {\r\n get() {\r\n return this.childNodes ? this.childNodes.filter((n: any) => n.nodeType === 2) : [];\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n }\r\n\r\n if (!('getAttribute' in adapted)) {\r\n adapted.getAttribute = function(name: string) {\r\n return this.getAttributeValue ? this.getAttributeValue(name) : null;\r\n };\r\n }\r\n\r\n return adapted as XPathNode;\r\n }\r\n\r\n /**\r\n * Convert XPathNode result back to XNode.\r\n * Since we're now using XNodes directly, this is mostly a type cast.\r\n */\r\n xPathNodeToXNode(xpathNode: XPathNode): XNode | null {\r\n if (!xpathNode) return null;\r\n // The nodes are already XNodes, just cast back\r\n return xpathNode as unknown as XNode;\r\n }\r\n\r\n /**\r\n * Get text content from an XNode.\r\n */\r\n private getTextContent(node: XNode): string {\r\n if (node.nodeType === 3 || node.nodeType === 2) { // TEXT_NODE or ATTRIBUTE_NODE\r\n return node.nodeValue || '';\r\n }\r\n\r\n if (!node.childNodes) return '';\r\n\r\n let text = '';\r\n for (const child of node.childNodes) {\r\n if (child.nodeType === 3) { // TEXT_NODE\r\n text += child.nodeValue || '';\r\n } else if (child.nodeType === 1) { // ELEMENT_NODE\r\n text += this.getTextContent(child);\r\n }\r\n }\r\n return text;\r\n }\r\n\r\n /**\r\n * Convert variables from ExprContext format to XPathContext format.\r\n */\r\n private convertVariables(exprContext: ExprContext): Record<string, any> {\r\n const variables: Record<string, any> = {};\r\n\r\n for (const [name, value] of Object.entries(exprContext.variables || {})) {\r\n if (value && typeof value === 'object' && 'stringValue' in value) {\r\n // It's a NodeValue, extract the raw value\r\n // Cast to any to access the type property which exists on concrete implementations\r\n const nodeValue = value as any;\r\n if (nodeValue.type === 'node-set') {\r\n variables[name] = (value as NodeSetValue).nodeSetValue().map(n => this.adaptXNode(n));\r\n } else if (nodeValue.type === 'string') {\r\n variables[name] = value.stringValue();\r\n } else if (nodeValue.type === 'number') {\r\n variables[name] = value.numberValue();\r\n } else if (nodeValue.type === 'boolean') {\r\n variables[name] = value.booleanValue();\r\n } else {\r\n // Unknown type, try to get string value\r\n variables[name] = value.stringValue();\r\n }\r\n } else {\r\n variables[name] = value;\r\n }\r\n }\r\n\r\n return variables;\r\n }\r\n\r\n /**\r\n * Create custom functions for XPath context (like key(), document(), etc.).\r\n */\r\n private createCustomFunctions(exprContext: ExprContext): Record<string, (...args: any[]) => any> {\r\n const functions: Record<string, (...args: any[]) => any> = {};\r\n\r\n // key() function - XSLT specific\r\n functions['key'] = (keyName: string, keyValue: string) => {\r\n const keyDef = exprContext.keys?.[keyName];\r\n if (keyDef && keyDef[keyValue]) {\r\n const nodeSetValue = keyDef[keyValue];\r\n return nodeSetValue.nodeSetValue().map((n: XNode) => this.adaptXNode(n));\r\n }\r\n return [];\r\n };\r\n\r\n // current() function - XSLT specific\r\n functions['current'] = () => {\r\n const currentNode = exprContext.nodeList[exprContext.position];\r\n return [this.adaptXNode(currentNode)];\r\n };\r\n\r\n // format-number() function - XSLT specific\r\n functions['format-number'] = (number: number, format: string, decimalFormatName?: string) => {\r\n const settings = exprContext.decimalFormatSettings;\r\n // Basic implementation - can be expanded\r\n return number.toLocaleString();\r\n };\r\n\r\n // xml-to-json() function - XSLT 3.0 specific\r\n functions['xml-to-json'] = (nodes: any) => {\r\n // Check XSLT version - only supported in 3.0\r\n if (exprContext.xsltVersion === '1.0') {\r\n throw new Error('xml-to-json() is not supported in XSLT 1.0. Use version=\"3.0\" in your stylesheet.');\r\n }\r\n\r\n // Handle node set or single node\r\n const node = Array.isArray(nodes) ? nodes[0] : nodes;\r\n if (!node) {\r\n return '\"\"';\r\n }\r\n\r\n // Convert XML node to JSON string\r\n return this.xmlToJson(node);\r\n };\r\n\r\n return functions;\r\n }\r\n\r\n /**\r\n * Convert an XML node to a JSON string representation.\r\n * This is a simplified implementation of XSLT 3.0's xml-to-json().\r\n */\r\n private xmlToJson(node: any): string {\r\n if (!node) {\r\n return '\"\"';\r\n }\r\n\r\n // Text node - return the text content as a JSON string\r\n if (node.nodeType === 3) { // TEXT_NODE\r\n const text = node.nodeValue || '';\r\n return JSON.stringify(text);\r\n }\r\n\r\n // Element node - get text content\r\n if (node.nodeType === 1) { // ELEMENT_NODE\r\n const textContent = this.getTextContent(node);\r\n return JSON.stringify(textContent);\r\n }\r\n\r\n // Attribute node\r\n if (node.nodeType === 2) { // ATTRIBUTE_NODE\r\n return JSON.stringify(node.nodeValue || '');\r\n }\r\n\r\n // Default\r\n return '\"\"';\r\n }\r\n\r\n /**\r\n * Wrap XPath result in appropriate NodeValue type.\r\n */\r\n wrapResult(result: XPathResult, exprContext: ExprContext): NodeValue {\r\n if (Array.isArray(result)) {\r\n // Node set - nodes are already XNodes (we use them directly)\r\n const xnodes = result.map(node => this.xPathNodeToXNode(node)).filter(n => n !== null) as XNode[];\r\n return new NodeSetValue(xnodes);\r\n }\r\n\r\n if (typeof result === 'string') {\r\n return new StringValue(result);\r\n }\r\n\r\n if (typeof result === 'number') {\r\n return new NumberValue(result);\r\n }\r\n\r\n if (typeof result === 'boolean') {\r\n return new BooleanValue(result);\r\n }\r\n\r\n // Default to empty node set\r\n return new NodeSetValue([]);\r\n }\r\n\r\n /**\r\n * Clear any internal state if needed.\r\n */\r\n clearCache() {\r\n // No caches to clear now that we use XNodes directly\r\n }\r\n}\r\n\r\n/**\r\n * XPath class that uses the new lexer/parser implementation\r\n * while maintaining API compatibility with the old implementation.\r\n */\r\nexport class XPath {\r\n private lexer: XPathLexer;\r\n private parser: XPathParser;\r\n private nodeConverter: NodeConverter;\r\n private parseCache: Map<string, Expression> = new Map();\r\n\r\n constructor() {\r\n this.lexer = new XPathLexer();\r\n this.parser = new XPathParser();\r\n this.nodeConverter = new NodeConverter();\r\n }\r\n\r\n /**\r\n * Parse an XPath expression and return an Expression object.\r\n * @param expression The XPath expression string.\r\n * @param axis Optional axis override for relative paths.\r\n */\r\n xPathParse(expression: string, axis?: string): Expression {\r\n const cacheKey = `${expression}:${axis || ''}`;\r\n\r\n if (this.parseCache.has(cacheKey)) {\r\n return this.parseCache.get(cacheKey)!;\r\n }\r\n\r\n const tokens = this.lexer.scan(expression);\r\n const xpathExpr = this.parser.parse(tokens);\r\n\r\n const wrappedExpr = this.wrapExpression(xpathExpr, axis);\r\n this.parseCache.set(cacheKey, wrappedExpr);\r\n\r\n return wrappedExpr;\r\n }\r\n\r\n /**\r\n * Parse and evaluate an XPath expression.\r\n * @param select The XPath expression string.\r\n * @param context The expression context.\r\n */\r\n xPathEval(select: string, context: ExprContext): NodeValue {\r\n const expression = this.xPathParse(select);\r\n return expression.evaluate(context);\r\n }\r\n\r\n /**\r\n * Sort nodes in context according to sort specifications.\r\n * @param context The expression context with nodes to sort.\r\n * @param sort Array of sort specifications.\r\n */\r\n xPathSort(context: ExprContext, sort: any[]) {\r\n if (sort.length === 0) {\r\n return;\r\n }\r\n\r\n const sortList: { node: XNode; key: { value: any; order: string }[] }[] = [];\r\n\r\n for (let i = 0; i < context.contextSize(); ++i) {\r\n const node = context.nodeList[i];\r\n const sortItem = {\r\n node,\r\n key: [] as { value: any; order: string }[]\r\n };\r\n const clonedContext = context.clone([node], 0);\r\n\r\n for (const s of sort) {\r\n const value = s.expr.evaluate(clonedContext);\r\n\r\n let evalue: any;\r\n if (s.type === 'text') {\r\n evalue = value.stringValue();\r\n } else if (s.type === 'number') {\r\n evalue = value.numberValue();\r\n }\r\n sortItem.key.push({\r\n value: evalue,\r\n order: s.order\r\n });\r\n }\r\n\r\n // Make sort stable by adding index as lowest priority\r\n sortItem.key.push({\r\n value: i,\r\n order: 'ascending'\r\n });\r\n\r\n sortList.push(sortItem);\r\n }\r\n\r\n sortList.sort(this.xPathSortByKey);\r\n\r\n const nodes: XNode[] = [];\r\n for (let i = 0; i < sortList.length; ++i) {\r\n const node = sortList[i].node;\r\n node.siblingPosition = i;\r\n nodes.push(node);\r\n }\r\n\r\n context.nodeList = nodes;\r\n context.setNode(0);\r\n }\r\n\r\n /**\r\n * Comparison function for sorting.\r\n */\r\n private xPathSortByKey(v1: any, v2: any): number {\r\n for (let i = 0; i < v1.key.length; ++i) {\r\n const o = v1.key[i].order === 'descending' ? -1 : 1;\r\n if (v1.key[i].value > v2.key[i].value) {\r\n return +1 * o;\r\n }\r\n if (v1.key[i].value < v2.key[i].value) {\r\n return -1 * o;\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Wrap a new XPath expression in the backward-compatible Expression class.\r\n */\r\n private wrapExpression(xpathExpr: XPathExpression, axis?: string): Expression {\r\n if (xpathExpr instanceof XPathLocationPath) {\r\n // Apply axis override if specified\r\n if (axis && xpathExpr.steps.length > 0 && !xpathExpr.absolute) {\r\n xpathExpr.steps[0].axis = axis as any;\r\n }\r\n return new LocationExpr(xpathExpr, this.nodeConverter);\r\n }\r\n\r\n if (xpathExpr instanceof XPathUnionExpression) {\r\n const expr1 = this.wrapExpression(xpathExpr.left, axis);\r\n const expr2 = this.wrapExpression(xpathExpr.right, axis);\r\n return new UnionExpr(xpathExpr, this.nodeConverter, expr1, expr2);\r\n }\r\n\r\n return new Expression(xpathExpr, this.nodeConverter);\r\n }\r\n\r\n /**\r\n * Clear parse cache (useful for testing or memory management).\r\n */\r\n clearCache() {\r\n this.parseCache.clear();\r\n this.nodeConverter.clearCache();\r\n }\r\n}\r\n","// Copyright 2023-2024 Design Liquido\r\n// XPath tokens and axis constants\r\n\r\n// The axes of XPath expressions.\r\nexport const xPathAxis = {\r\n ANCESTOR_OR_SELF: 'ancestor-or-self',\r\n ANCESTOR: 'ancestor',\r\n ATTRIBUTE: 'attribute',\r\n CHILD: 'child',\r\n DESCENDANT_OR_SELF: 'descendant-or-self',\r\n DESCENDANT: 'descendant',\r\n FOLLOWING_SIBLING: 'following-sibling',\r\n FOLLOWING: 'following',\r\n NAMESPACE: 'namespace',\r\n PARENT: 'parent',\r\n PRECEDING_SIBLING: 'preceding-sibling',\r\n PRECEDING: 'preceding',\r\n SELF: 'self',\r\n SELF_AND_SIBLINGS: 'self-and-siblings' // Doesn't exist officially.\r\n // It is here for a special case of `<xsl:apply-templates>`.\r\n};\r\n\r\n// Token rule for number matching (used by expr-context.ts)\r\nexport const TOK_NUMBER = {\r\n label: '[number]',\r\n prec: 35,\r\n re: new RegExp('^\\\\d+(\\\\.\\\\d*)?'),\r\n key: undefined\r\n};\r\n","import { DOM_DOCUMENT_NODE } from '../constants';\r\nimport { BooleanValue } from './values/boolean-value';\r\nimport { NodeSetValue } from './values/node-set-value';\r\nimport { NumberValue } from './values/number-value';\r\nimport { StringValue } from './values/string-value';\r\nimport { TOK_NUMBER } from './tokens';\r\nimport { XNode } from '../dom';\r\nimport { XsltDecimalFormatSettings } from '../xslt/xslt-decimal-format-settings';\r\nimport { NodeValue } from './values';\r\n\r\n/**\r\n * XPath expression evaluation context. An XPath context consists of a\r\n * DOM node, a list of DOM nodes that contains this node, a number\r\n * that represents the position of the single node in the list, and a\r\n * current set of variable bindings. (See XPath spec.)\r\n *\r\n * setVariable(name, expr) -- binds given XPath expression to the\r\n * name.\r\n *\r\n * getVariable(name) -- what the name says.\r\n *\r\n * setNode(position) -- sets the context to the node at the given\r\n * position. Needed to implement scoping rules for variables in\r\n * XPath. (A variable is visible to all subsequent siblings, not\r\n * only to its children.)\r\n *\r\n * set/isCaseInsensitive -- specifies whether node name tests should\r\n * be case sensitive. If you're executing xpaths against a regular\r\n * HTML DOM, you probably don't want case-sensitivity, because\r\n * browsers tend to disagree about whether elements & attributes\r\n * should be upper/lower case. If you're running xpaths in an\r\n * XSLT instance, you probably DO want case sensitivity, as per the\r\n * XSL spec.\r\n *\r\n * set/isReturnOnFirstMatch -- whether XPath evaluation should quit as soon\r\n * as a result is found. This is an optimization that might make sense if you\r\n * only care about the first result.\r\n *\r\n * set/isIgnoreNonElementNodesForNTA -- whether to ignore non-element nodes\r\n * when evaluating the \"node()\" any node test. While technically this is\r\n * contrary to the XPath spec, practically it can enhance performance\r\n * significantly, and makes sense if you a) use \"node()\" when you mean \"*\",\r\n * and b) use \"//\" when you mean \"/descendant::* /\".\r\n */\r\nexport class ExprContext {\r\n position: number;\r\n nodeList: XNode[];\r\n xsltVersion: '1.0' | '2.0' | '3.0';\r\n\r\n variables: { [name: string]: NodeValue };\r\n keys: { [name: string]: { [key: string]: NodeValue } };\r\n knownNamespaces: { [alias: string]: string };\r\n\r\n caseInsensitive: any;\r\n ignoreAttributesWithoutValue: any;\r\n returnOnFirstMatch: any;\r\n ignoreNonElementNodesForNTA: any;\r\n\r\n parent: ExprContext;\r\n root: XNode;\r\n decimalFormatSettings: XsltDecimalFormatSettings;\r\n\r\n inApplyTemplates: boolean;\r\n baseTemplateMatched: boolean;\r\n\r\n /**\r\n * Constructor -- gets the node, its position, the node set it\r\n * belongs to, and a parent context as arguments. The parent context\r\n * is used to implement scoping rules for variables: if a variable\r\n * is not found in the current context, it is looked for in the\r\n * parent context, recursively. Except for node, all arguments have\r\n * default values: default position is 0, default node set is the\r\n * set that contains only the node, and the default parent is null.\r\n *\r\n * Notice that position starts at 0 at the outside interface;\r\n * inside XPath expressions this shows up as position()=1.\r\n * @param nodeList TODO\r\n * @param opt_position TODO\r\n * @param opt_parent TODO\r\n * @param opt_caseInsensitive TODO\r\n * @param opt_ignoreAttributesWithoutValue TODO\r\n * @param opt_returnOnFirstMatch TODO\r\n * @param opt_ignoreNonElementNodesForNTA TODO\r\n */\r\n constructor(\r\n nodeList: XNode[],\r\n xsltVersion: '1.0' | '2.0' | '3.0' = '1.0',\r\n opt_position?: number,\r\n opt_decimalFormatSettings?: XsltDecimalFormatSettings,\r\n opt_variables?: { [name: string]: any },\r\n opt_knownNamespaces?: { [alias: string]: string },\r\n opt_parent?: ExprContext,\r\n opt_caseInsensitive?: any,\r\n opt_ignoreAttributesWithoutValue?: any,\r\n opt_returnOnFirstMatch?: any,\r\n opt_ignoreNonElementNodesForNTA?: any\r\n ) {\r\n this.nodeList = nodeList;\r\n this.xsltVersion = xsltVersion;\r\n\r\n this.position = opt_position || 0;\r\n\r\n this.variables = opt_variables || {};\r\n this.keys = opt_parent?.keys || {};\r\n this.knownNamespaces = opt_knownNamespaces || {};\r\n\r\n this.parent = opt_parent || null;\r\n this.caseInsensitive = opt_caseInsensitive || false;\r\n this.ignoreAttributesWithoutValue = opt_ignoreAttributesWithoutValue || false;\r\n this.returnOnFirstMatch = opt_returnOnFirstMatch || false;\r\n this.ignoreNonElementNodesForNTA = opt_ignoreNonElementNodesForNTA || false;\r\n this.inApplyTemplates = false;\r\n this.baseTemplateMatched = false;\r\n\r\n this.decimalFormatSettings = opt_decimalFormatSettings || {\r\n decimalSeparator: '.',\r\n groupingSeparator: ',',\r\n infinity: 'Infinity',\r\n minusSign: '-',\r\n naN: 'NaN',\r\n percent: '%',\r\n perMille: '‰',\r\n zeroDigit: '0',\r\n digit: '#',\r\n patternSeparator: ';'\r\n };\r\n\r\n if (opt_parent) {\r\n this.root = opt_parent.root;\r\n } else if (this.nodeList[this.position].nodeType == DOM_DOCUMENT_NODE) {\r\n // NOTE(mesch): DOM Spec stipulates that the ownerDocument of a\r\n // document is null. Our root, however is the document that we are\r\n // processing, so the initial context is created from its document\r\n // node, which case we must handle here explicitly.\r\n this.root = this.nodeList[this.position];\r\n } else {\r\n this.root = this.nodeList[this.position].ownerDocument;\r\n }\r\n }\r\n\r\n /**\r\n * clone() -- creates a new context with the current context as\r\n * parent. If passed as argument to clone(), the new context has a\r\n * different node, position, or node set. What is not passed is\r\n * inherited from the cloned context.\r\n * @param opt_nodeList TODO\r\n * @param opt_position TODO\r\n * @returns TODO\r\n */\r\n clone(opt_nodeList?: XNode[], opt_position?: number) {\r\n return new ExprContext(\r\n opt_nodeList || this.nodeList,\r\n this.xsltVersion,\r\n typeof opt_position !== 'undefined' ? opt_position : this.position,\r\n this.decimalFormatSettings,\r\n this.variables,\r\n this.knownNamespaces,\r\n this,\r\n this.caseInsensitive,\r\n this.ignoreAttributesWithoutValue,\r\n this.returnOnFirstMatch,\r\n this.ignoreNonElementNodesForNTA\r\n );\r\n }\r\n\r\n setVariable(name?: string, value?: NodeValue | string) {\r\n if (\r\n value instanceof StringValue ||\r\n value instanceof BooleanValue ||\r\n value instanceof NumberValue ||\r\n value instanceof NodeSetValue\r\n ) {\r\n this.variables[name] = value;\r\n return;\r\n }\r\n\r\n if ('true' === value) {\r\n this.variables[name] = new BooleanValue(true);\r\n } else if ('false' === value) {\r\n this.variables[name] = new BooleanValue(false);\r\n } else if (TOK_NUMBER.re.test(String(value))) {\r\n this.variables[name] = new NumberValue(value);\r\n } else {\r\n // DGF What if it's null?\r\n this.variables[name] = new StringValue(value);\r\n }\r\n }\r\n\r\n getVariable(name: string): NodeValue {\r\n if (typeof this.variables[name] != 'undefined') {\r\n return this.variables[name];\r\n }\r\n\r\n if (this.parent) {\r\n return this.parent.getVariable(name);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n setNode(position: number) {\r\n this.position = position;\r\n }\r\n\r\n contextSize() {\r\n return this.nodeList.length;\r\n }\r\n\r\n isCaseInsensitive() {\r\n return this.caseInsensitive;\r\n }\r\n\r\n setCaseInsensitive(caseInsensitive) {\r\n return (this.caseInsensitive = caseInsensitive);\r\n }\r\n\r\n isIgnoreAttributesWithoutValue() {\r\n return this.ignoreAttributesWithoutValue;\r\n }\r\n\r\n setIgnoreAttributesWithoutValue(ignore) {\r\n return (this.ignoreAttributesWithoutValue = ignore);\r\n }\r\n\r\n isReturnOnFirstMatch() {\r\n return this.returnOnFirstMatch;\r\n }\r\n\r\n setReturnOnFirstMatch(returnOnFirstMatch) {\r\n return (this.returnOnFirstMatch = returnOnFirstMatch);\r\n }\r\n\r\n isIgnoreNonElementNodesForNTA() {\r\n return this.ignoreNonElementNodesForNTA;\r\n }\r\n\r\n setIgnoreNonElementNodesForNTA(ignoreNonElementNodesForNTA) {\r\n return (this.ignoreNonElementNodesForNTA = ignoreNonElementNodesForNTA);\r\n }\r\n}\r\n","// Copyright 2023-2024 Design Liquido\r\n// Match resolver that works with the new XPath implementation.\r\n\r\nimport { XNode } from '../dom';\r\nimport { ExprContext } from './expr-context';\r\nimport { Expression, LocationExpr, UnionExpr } from './xpath';\r\n\r\n/**\r\n * Class that resolves XPath expressions, returning nodes.\r\n * This is used for XSLT pattern matching.\r\n */\r\nexport class MatchResolver {\r\n\r\n /**\r\n * Entry point for expression matching.\r\n * @param expression The expression to be resolved.\r\n * @param context The Expression Context.\r\n * @returns An array of nodes.\r\n */\r\n expressionMatch(expression: Expression, context: ExprContext): XNode[] {\r\n if (expression instanceof LocationExpr) {\r\n return this.locationExpressionMatch(expression, context);\r\n }\r\n\r\n if (expression instanceof UnionExpr) {\r\n return this.unionExpressionMatch(expression, context);\r\n }\r\n\r\n // For other expression types, evaluate and return node set\r\n try {\r\n const result = expression.evaluate(context);\r\n return result.nodeSetValue();\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n /**\r\n * Resolves a LocationExpr.\r\n * @param expression The Location Expression.\r\n * @param context The Expression Context.\r\n * @returns Either the results of a relative resolution, or the results of an\r\n * absolute resolution.\r\n */\r\n private locationExpressionMatch(expression: LocationExpr, context: ExprContext): XNode[] {\r\n if (!expression.steps || expression.steps.length <= 0) {\r\n // Handle \"/\" alone - matches the document root\r\n if (expression.absolute) {\r\n // Check if context node is the document node\r\n const contextNode = context.nodeList[context.position];\r\n if (contextNode.nodeName === '#document') {\r\n return [contextNode];\r\n }\r\n // Otherwise, no match\r\n return [];\r\n }\r\n // For relative expressions without steps, return current context node\r\n return [context.nodeList[context.position]];\r\n }\r\n\r\n if (expression.absolute) {\r\n // If expression is absolute and the axis of first step is self,\r\n // the match starts by the #document node.\r\n const firstStep = expression.steps[0];\r\n if (firstStep.axis === 'self') {\r\n return this.absoluteXsltMatchByDocumentNode(expression, context);\r\n }\r\n\r\n return this.absoluteXsltMatch(expression, context);\r\n }\r\n\r\n return this.relativeXsltMatch(expression, context);\r\n }\r\n\r\n /**\r\n * Resolves a UnionExpr.\r\n * @param expression The Union Expression.\r\n * @param context The Expression Context.\r\n * @returns The concatenated result of evaluating both sides of the expression.\r\n */\r\n private unionExpressionMatch(expression: UnionExpr, context: ExprContext): XNode[] {\r\n const expr1Nodes = this.expressionMatch(expression.expr1, context);\r\n return expr1Nodes.concat(this.expressionMatch(expression.expr2, context));\r\n }\r\n\r\n /**\r\n * Finds all the nodes through absolute XPath search, starting on\r\n * the #document parent node.\r\n * @param expression The Expression.\r\n * @param context The Expression Context.\r\n * @returns The list of found nodes.\r\n */\r\n private absoluteXsltMatchByDocumentNode(expression: LocationExpr, context: ExprContext): XNode[] {\r\n const clonedContext = context.clone([context.root], 0);\r\n const matchedNodes = expression.evaluate(clonedContext).nodeSetValue();\r\n const finalList: XNode[] = [];\r\n\r\n for (const element of matchedNodes) {\r\n if (element.id === context.nodeList[context.position].id) {\r\n finalList.push(element);\r\n }\r\n }\r\n\r\n return finalList;\r\n }\r\n\r\n /**\r\n * Finds all the nodes through absolute XPath search, starting with the\r\n * first child of the #document node.\r\n * @param expression The Expression.\r\n * @param context The Expression Context.\r\n * @returns The list of found nodes.\r\n */\r\n private absoluteXsltMatch(expression: LocationExpr, context: ExprContext): XNode[] {\r\n const firstChildOfRoot = context.root.childNodes.find((c: XNode) => c.nodeName !== '#dtd-section');\r\n if (!firstChildOfRoot) return [];\r\n\r\n const clonedContext = context.clone([firstChildOfRoot], 0);\r\n const matchedNodes = expression.evaluate(clonedContext).nodeSetValue();\r\n const finalList: XNode[] = [];\r\n\r\n // If the context is pointing to #document node, its child node is considered.\r\n let nodeList: XNode[];\r\n if (context.nodeList.length === 1 && context.nodeList[0].nodeName === '#document') {\r\n nodeList = [context.nodeList[0].childNodes.find((c: XNode) => c.nodeName !== '#dtd-section')];\r\n } else {\r\n nodeList = context.nodeList;\r\n }\r\n\r\n for (const element of matchedNodes) {\r\n if (element.id === nodeList[context.position]?.id) {\r\n finalList.push(element);\r\n }\r\n }\r\n\r\n return finalList;\r\n }\r\n\r\n /**\r\n * Tries to find relative nodes from the actual context position.\r\n * If found nodes are already in the context, or if they are children of\r\n * nodes in the context, they are returned.\r\n * @param expression The expression used.\r\n * @param context The Expression Context.\r\n * @returns The list of found nodes.\r\n */\r\n private relativeXsltMatch(expression: LocationExpr, context: ExprContext): XNode[] {\r\n const clonedContext = context.clone();\r\n const nodes = expression.evaluate(clonedContext).nodeSetValue();\r\n\r\n if (nodes.length === 1 && nodes[0].nodeName === '#document') {\r\n // As we don't work with the #document node directly, this part\r\n // returns its first sibling.\r\n return [nodes[0].childNodes[0]];\r\n }\r\n\r\n return nodes;\r\n }\r\n}\r\n","import { BooleanValue } from \"../values/boolean-value\";\r\nimport { NodeTest } from \"./node-test\";\r\n\r\nexport class NodeTestAny implements NodeTest {\r\n value: any;\r\n\r\n constructor() {\r\n this.value = new BooleanValue(true);\r\n }\r\n\r\n evaluate() {\r\n return this.value;\r\n }\r\n}\r\n","import { DOM_COMMENT_NODE } from \"../../constants\";\r\nimport { ExprContext } from \"../expr-context\";\r\nimport { NodeTest } from \"./node-test\";\r\nimport { BooleanValue } from \"../values/boolean-value\";\r\n\r\nexport class NodeTestComment implements NodeTest {\r\n evaluate(ctx: ExprContext) {\r\n return new BooleanValue(ctx.nodeList[ctx.position].nodeType == DOM_COMMENT_NODE);\r\n }\r\n}\r\n","import { DOM_ATTRIBUTE_NODE, DOM_ELEMENT_NODE } from \"../../constants\";\r\nimport { ExprContext } from \"../expr-context\";\r\nimport { BooleanValue } from \"../values/boolean-value\";\r\nimport { NodeTest } from \"./node-test\";\r\n\r\nexport class NodeTestElementOrAttribute implements NodeTest {\r\n evaluate(context: ExprContext) {\r\n const node = context.nodeList[context.position];\r\n return new BooleanValue(node.nodeType == DOM_ELEMENT_NODE || node.nodeType == DOM_ATTRIBUTE_NODE);\r\n }\r\n}\r\n","import { ExprContext } from \"../expr-context\";\r\nimport { NodeValue } from \"../values\";\r\nimport { BooleanValue } from \"../values/boolean-value\";\r\nimport { NodeTest } from \"./node-test\";\r\n\r\nexport class NodeTestName implements NodeTest {\r\n name: string;\r\n namespacePrefix: string;\r\n re: RegExp;\r\n\r\n constructor(name: string) {\r\n this.name = name;\r\n if (name.indexOf(':') > 0) {\r\n const nameAndNamespacePrefix = name.split(':');\r\n this.namespacePrefix = nameAndNamespacePrefix[0];\r\n this.name = nameAndNamespacePrefix[1];\r\n }\r\n\r\n this.re = new RegExp(`^${name}$`, 'i');\r\n }\r\n\r\n evaluate(context: ExprContext): NodeValue {\r\n const node = context.nodeList[context.position];\r\n if (this.namespacePrefix !== undefined) {\r\n const namespaceValue = context.knownNamespaces[this.namespacePrefix];\r\n if (namespaceValue !== node.namespaceUri) {\r\n return new BooleanValue(false);\r\n }\r\n\r\n if (context.caseInsensitive) {\r\n if (node.localName.length !== this.name.length) return new BooleanValue(false);\r\n return new BooleanValue(this.re.test(node.localName));\r\n }\r\n\r\n return new BooleanValue(node.localName === this.name);\r\n }\r\n\r\n if (context.caseInsensitive) {\r\n if (node.nodeName.length !== this.name.length) return new BooleanValue(false);\r\n return new BooleanValue(this.re.test(node.nodeName));\r\n }\r\n\r\n return new BooleanValue(node.nodeName === this.name);\r\n }\r\n}\r\n","import { ExprContext } from \"../expr-context\";\r\nimport { NodeTest } from \"./node-test\";\r\nimport { BooleanValue } from \"../values/boolean-value\";\r\n\r\nexport class NodeTestNC implements NodeTest {\r\n regex: RegExp;\r\n\r\n nsprefix: any;\r\n\r\n constructor(nsprefix: string) {\r\n this.regex = new RegExp(`^${nsprefix}:`);\r\n this.nsprefix = nsprefix;\r\n }\r\n\r\n evaluate(ctx: ExprContext) {\r\n const n = ctx.nodeList[ctx.position];\r\n return new BooleanValue(n.nodeName.match(this.regex));\r\n }\r\n}\r\n","import { DOM_PROCESSING_INSTRUCTION_NODE } from \"../../constants\";\r\nimport { ExprContext } from \"../expr-context\";\r\nimport { BooleanValue } from \"../values/boolean-value\";\r\nimport { NodeTest } from \"./node-test\";\r\n\r\nexport class NodeTestPI implements NodeTest {\r\n target: any;\r\n\r\n constructor(target: any) {\r\n this.target = target;\r\n }\r\n\r\n evaluate(context: ExprContext) {\r\n const node = context.nodeList[context.position];\r\n return new BooleanValue(\r\n node.nodeType == DOM_PROCESSING_INSTRUCTION_NODE && (!this.target || node.nodeName == this.target)\r\n );\r\n }\r\n}\r\n","import { DOM_TEXT_NODE } from \"../../constants\";\r\nimport { ExprContext } from \"../expr-context\";\r\nimport { BooleanValue } from \"../values/boolean-value\";\r\nimport { NodeTest } from \"./node-test\";\r\n\r\nexport class NodeTestText implements NodeTest {\r\n evaluate(ctx: ExprContext) {\r\n return new BooleanValue(ctx.nodeList[ctx.position].nodeType == DOM_TEXT_NODE);\r\n }\r\n}\r\n","import { XNode } from \"../dom/xnode\";\r\nimport { DOM_ELEMENT_NODE } from '../constants';\r\nimport { ExprContext, XPath, MatchResolver, Expression, LocationExpr, UnionExpr } from \"../xpath\";\r\nimport { TemplatePriority } from \"./template-priority\";\r\nimport { TemplateSelectionResult } from \"./template-selection-result\";\r\nimport { NodeTestAny, NodeTestComment, NodeTestElementOrAttribute, NodeTestName, NodeTestNC, NodeTestPI, NodeTestText } from \"../xpath/node-tests\";\r\n\r\n/**\r\n * Calculate the default priority for a single step pattern.\r\n *\r\n * According to XSLT 3.0 spec section 6.4:\r\n * - Priority -0.5: node tests of form node(), text(), comment(),\r\n * processing-instruction(), *, @*, namespace::*\r\n * - Priority -0.25: namespace wildcards like ns:*, @ns:*\r\n * - Priority 0: qualified names like foo, @bar, processing-instruction('literal')\r\n * - Priority 0.5: patterns with multiple steps or predicates\r\n */\r\nfunction calculateStepPriority(step: any): number {\r\n const nodeTest = step.nodeTest;\r\n const hasPredicates = (step.predicate && step.predicate.length > 0) ||\r\n (step.predicates && step.predicates.length > 0);\r\n\r\n // Predicates always result in 0.5\r\n if (hasPredicates) {\r\n return 0.5;\r\n }\r\n\r\n // Handle new XPath implementation's object-based node tests\r\n if (nodeTest && typeof nodeTest === 'object' && 'type' in nodeTest) {\r\n switch (nodeTest.type) {\r\n case 'wildcard':\r\n // Check for namespace wildcard like \"ns:*\"\r\n if (nodeTest.name && nodeTest.name.endsWith(':*')) {\r\n return -0.25;\r\n }\r\n // Regular wildcard * or @*\r\n return -0.5;\r\n\r\n case 'node-type':\r\n // node(), text(), comment(), processing-instruction()\r\n if (nodeTest.nodeType === 'processing-instruction' && nodeTest.name) {\r\n // processing-instruction('literal') has priority 0\r\n return 0;\r\n }\r\n return -0.5;\r\n\r\n case 'processing-instruction':\r\n // processing-instruction('literal') or processing-instruction()\r\n return nodeTest.name ? 0 : -0.5;\r\n\r\n case 'name':\r\n // Qualified name like foo, ns:foo, @bar\r\n return 0;\r\n\r\n default:\r\n return 0;\r\n }\r\n }\r\n\r\n // Handle legacy class-based node tests (for backward compatibility)\r\n if (nodeTest instanceof NodeTestAny) {\r\n // node() - matches any node\r\n return -0.5;\r\n }\r\n\r\n if (nodeTest instanceof NodeTestElementOrAttribute) {\r\n // * or @* - wildcard for elements or attributes\r\n return -0.5;\r\n }\r\n\r\n if (nodeTest instanceof NodeTestText) {\r\n // text()\r\n return -0.5;\r\n }\r\n\r\n if (nodeTest instanceof NodeTestComment) {\r\n // comment()\r\n return -0.5;\r\n }\r\n\r\n if (nodeTest instanceof NodeTestPI) {\r\n // processing-instruction() - with literal = 0, without = -0.5\r\n return nodeTest.target ? 0 : -0.5;\r\n }\r\n\r\n if (nodeTest instanceof NodeTestNC) {\r\n // Namespace wildcard like ns:* - priority -0.25\r\n return -0.25;\r\n }\r\n\r\n if (nodeTest instanceof NodeTestName) {\r\n // Qualified name like foo, ns:foo, @bar\r\n return 0;\r\n }\r\n\r\n // Default fallback\r\n return 0;\r\n}\r\n\r\n/**\r\n * Calculate the default priority for a location path expression.\r\n */\r\nfunction calculateLocationPathPriority(expr: LocationExpr): number {\r\n if (!expr.steps || expr.steps.length === 0) {\r\n // \"/\" alone (absolute path with no steps) matches the document root\r\n // According to XSLT spec, this has priority -0.5\r\n if (expr.absolute) {\r\n return -0.5;\r\n }\r\n return 0;\r\n }\r\n\r\n // Multiple steps = priority 0.5\r\n if (expr.steps.length > 1) {\r\n return 0.5;\r\n }\r\n\r\n // Single step - calculate based on the step's node test\r\n return calculateStepPriority(expr.steps[0]);\r\n}\r\n\r\n/**\r\n * Calculate the default priority for a union expression.\r\n * For union patterns like \"foo | bar\", each alternative is treated as a\r\n * separate rule. When used as a single template, we return the lowest priority\r\n * among all alternatives (most conservative).\r\n */\r\nfunction calculateUnionExprPriority(expr: UnionExpr, xPath: XPath): number {\r\n const priority1 = calculateDefaultPriorityFromExpression(expr.expr1, xPath);\r\n const priority2 = calculateDefaultPriorityFromExpression(expr.expr2, xPath);\r\n // Return the lowest (most conservative) priority for union patterns\r\n return Math.min(priority1, priority2);\r\n}\r\n\r\n/**\r\n * Calculate the default priority from a parsed expression.\r\n */\r\nfunction calculateDefaultPriorityFromExpression(expr: Expression, xPath: XPath): number {\r\n if (expr instanceof LocationExpr) {\r\n return calculateLocationPathPriority(expr);\r\n }\r\n\r\n if (expr instanceof UnionExpr) {\r\n return calculateUnionExprPriority(expr, xPath);\r\n }\r\n\r\n // For other expression types (filter, path, function call, etc.),\r\n // use priority 0.5 as they represent complex patterns\r\n return 0.5;\r\n}\r\n\r\n/**\r\n * Calculate the default priority for an XSLT pattern string.\r\n *\r\n * @param pattern The match pattern string (e.g., \"book\", \"chapter/title\", \"*\")\r\n * @param xPath The XPath instance for parsing\r\n * @returns The calculated default priority\r\n */\r\nexport function calculateDefaultPriority(pattern: string, xPath: XPath): number {\r\n try {\r\n const expr = xPath.xPathParse(pattern, 'self-and-siblings');\r\n return calculateDefaultPriorityFromExpression(expr, xPath);\r\n } catch (e) {\r\n // If parsing fails, return default priority 0\r\n console.warn(`Failed to parse pattern \"${pattern}\" for priority calculation:`, e);\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Check if a template matches the given mode.\r\n * A template matches if:\r\n * - mode is null/undefined and template has no mode attribute\r\n * - mode is '#all' (matches any template)\r\n * - template mode equals the given mode\r\n * - template mode is '#all'\r\n */\r\nfunction matchesMode(template: XNode, mode: string | null): boolean {\r\n const templateMode = template.getAttributeValue('mode');\r\n\r\n // If no mode specified in apply-templates, match templates without mode\r\n if (!mode) {\r\n return !templateMode || templateMode === '#default';\r\n }\r\n\r\n // Mode '#all' in apply-templates matches any template\r\n if (mode === '#all') {\r\n return true;\r\n }\r\n\r\n // Template with mode '#all' matches any mode\r\n if (templateMode === '#all') {\r\n return true;\r\n }\r\n\r\n // Direct mode match\r\n return templateMode === mode;\r\n}\r\n\r\n/**\r\n * Check if a node is an xsl:template element.\r\n */\r\nfunction isTemplate(node: XNode): boolean {\r\n if (node.nodeType !== DOM_ELEMENT_NODE) {\r\n return false;\r\n }\r\n\r\n // Check by namespace URI or prefix\r\n if (node.namespaceUri === 'http://www.w3.org/1999/XSL/Transform') {\r\n return node.localName === 'template';\r\n }\r\n\r\n return node.prefix === 'xsl' && node.localName === 'template';\r\n}\r\n\r\n/**\r\n * Collect all templates from the stylesheet with their priority metadata.\r\n *\r\n * @param stylesheetElement The root element of the stylesheet (xsl:stylesheet or xsl:transform)\r\n * @param mode The mode to filter templates by (null for default mode)\r\n * @param xPath The XPath instance for parsing patterns\r\n * @returns Array of templates with priority metadata\r\n */\r\nexport function collectAndExpandTemplates(\r\n stylesheetElement: XNode,\r\n mode: string | null,\r\n xPath: XPath\r\n): TemplatePriority[] {\r\n const templates: TemplatePriority[] = [];\r\n let docOrder = 0;\r\n\r\n for (const child of stylesheetElement.childNodes) {\r\n if (!isTemplate(child)) {\r\n continue;\r\n }\r\n\r\n if (!matchesMode(child, mode)) {\r\n continue;\r\n }\r\n\r\n const match = child.getAttributeValue('match');\r\n if (!match) {\r\n // Templates without match attribute are named templates, skip them\r\n continue;\r\n }\r\n\r\n const priorityAttr = child.getAttributeValue('priority');\r\n const explicitPriority = priorityAttr ? parseFloat(priorityAttr) : null;\r\n const defaultPriority = calculateDefaultPriority(match, xPath);\r\n const effectivePriority = explicitPriority !== null && !isNaN(explicitPriority)\r\n ? explicitPriority\r\n : defaultPriority;\r\n\r\n templates.push({\r\n template: child,\r\n explicitPriority: explicitPriority !== null && !isNaN(explicitPriority) ? explicitPriority : null,\r\n defaultPriority,\r\n effectivePriority,\r\n importPrecedence: 0, // TODO: Set properly when xsl:import is fully implemented\r\n documentOrder: docOrder++,\r\n matchPattern: match\r\n });\r\n }\r\n\r\n return templates;\r\n}\r\n\r\n/**\r\n * Split a pattern string by the union operator '|', respecting brackets and quotes.\r\n * For example: \"@*|node()\" -> [\"@*\", \"node()\"]\r\n * But: \"item[@id='a|b']\" -> [\"item[@id='a|b']\"] (not split inside quotes)\r\n *\r\n * @param pattern The pattern string to split\r\n * @returns Array of pattern alternatives\r\n */\r\nfunction splitUnionPattern(pattern: string): string[] {\r\n const alternatives: string[] = [];\r\n let current = '';\r\n let depth = 0; // Track bracket depth\r\n let inSingleQuote = false;\r\n let inDoubleQuote = false;\r\n\r\n for (let i = 0; i < pattern.length; i++) {\r\n const char = pattern[i];\r\n\r\n if (char === \"'\" && !inDoubleQuote) {\r\n inSingleQuote = !inSingleQuote;\r\n current += char;\r\n } else if (char === '\"' && !inSingleQuote) {\r\n inDoubleQuote = !inDoubleQuote;\r\n current += char;\r\n } else if (!inSingleQuote && !inDoubleQuote) {\r\n if (char === '[' || char === '(') {\r\n depth++;\r\n current += char;\r\n } else if (char === ']' || char === ')') {\r\n depth--;\r\n current += char;\r\n } else if (char === '|' && depth === 0) {\r\n // Union operator at top level\r\n alternatives.push(current.trim());\r\n current = '';\r\n } else {\r\n current += char;\r\n }\r\n } else {\r\n current += char;\r\n }\r\n }\r\n\r\n // Don't forget the last alternative\r\n if (current.trim()) {\r\n alternatives.push(current.trim());\r\n }\r\n\r\n return alternatives;\r\n}\r\n\r\n/**\r\n * Check if a node matches a single (non-union) pattern.\r\n *\r\n * @param node The node to test\r\n * @param pattern The match pattern string (should not contain union operator at top level)\r\n * @param context The original context (for namespace/variable info)\r\n * @param matchResolver The match resolver\r\n * @param xPath The XPath instance\r\n * @returns true if the node matches the pattern\r\n */\r\nfunction nodeMatchesSinglePattern(\r\n node: XNode,\r\n pattern: string,\r\n context: ExprContext,\r\n matchResolver: MatchResolver,\r\n xPath: XPath\r\n): boolean {\r\n // Special case for root pattern \"/\"\r\n if (pattern === '/') {\r\n return node.nodeName === '#document';\r\n }\r\n\r\n // Special case for attribute patterns like \"@class\", \"@*\", \"@ns:name\"\r\n if (pattern.startsWith('@')) {\r\n // Only attribute nodes (nodeType 2) can match attribute patterns\r\n if (node.nodeType !== 2) {\r\n return false;\r\n }\r\n const attrPattern = pattern.substring(1); // Remove '@'\r\n if (attrPattern === '*') {\r\n // @* matches any attribute\r\n return true;\r\n }\r\n // Match by attribute name (considering local name for namespaced attributes)\r\n const attrName = node.localName || node.nodeName;\r\n // Handle namespaced patterns like \"ns:name\" - just compare local names\r\n const patternLocalName = attrPattern.includes(':')\r\n ? attrPattern.substring(attrPattern.indexOf(':') + 1)\r\n : attrPattern;\r\n return attrName === patternLocalName || node.nodeName === attrPattern;\r\n }\r\n\r\n // For patterns starting with '*' (where axis override doesn't work),\r\n // check if the node passes the pattern test directly\r\n if (pattern === '*' && node.nodeType === DOM_ELEMENT_NODE) {\r\n return true;\r\n }\r\n\r\n // For simple element name patterns first (like \"section\" or \"div\")\r\n // Try matching by element name directly\r\n if (!pattern.includes('/') && !pattern.includes('[') && !pattern.startsWith('@')) {\r\n if (pattern === node.nodeName || pattern === node.localName) {\r\n return true;\r\n }\r\n }\r\n\r\n // For patterns with '/' (absolute or descendant paths) or '[' (predicates),\r\n // we need to evaluate from document root and check if node is in result\r\n if (pattern.includes('/') || pattern.includes('[')) {\r\n try {\r\n // Evaluate pattern from document root\r\n // If pattern doesn't start with '/', add '//' to match anywhere in document\r\n const evaluationPattern = pattern.startsWith('/') ? pattern : '//' + pattern;\r\n const rootContext = context.clone([context.root], 0);\r\n \r\n // Use xPathEval for pattern evaluation (handles // patterns correctly)\r\n const evalResult = xPath.xPathEval(evaluationPattern, rootContext);\r\n const nodes = evalResult.nodeSetValue();\r\n\r\n if (nodes.some(n => n.id === node.id)) {\r\n return true;\r\n }\r\n } catch (e) {\r\n // Pattern parsing failed, continue to next approach\r\n }\r\n }\r\n\r\n // For simple element name patterns - try with 'self-and-siblings' axis override as fallback\r\n if (!pattern.includes('/') && !pattern.includes('[') && !pattern.startsWith('@')) {\r\n try {\r\n const nodeContext = context.clone([node], 0);\r\n const expr = xPath.xPathParse(pattern, 'self-and-siblings');\r\n const nodes = matchResolver.expressionMatch(expr, nodeContext);\r\n\r\n // Check if the current node is in the matched nodes\r\n if (nodes.some(n => n.id === node.id)) {\r\n return true;\r\n }\r\n } catch (e) {\r\n // Pattern parsing failed\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if a node matches a given pattern.\r\n * This handles union patterns by splitting them and testing each alternative.\r\n *\r\n * @param node The node to test\r\n * @param pattern The match pattern string\r\n * @param context The original context (for namespace/variable info)\r\n * @param matchResolver The match resolver\r\n * @param xPath The XPath instance\r\n * @returns true if the node matches the pattern\r\n */\r\nfunction nodeMatchesPattern(\r\n node: XNode,\r\n pattern: string,\r\n context: ExprContext,\r\n matchResolver: MatchResolver,\r\n xPath: XPath\r\n): boolean {\r\n // Handle union patterns by splitting and testing each alternative\r\n const alternatives = splitUnionPattern(pattern);\r\n\r\n // If there are multiple alternatives, test each one\r\n // Return true if ANY alternative matches\r\n for (const alt of alternatives) {\r\n if (nodeMatchesSinglePattern(node, alt, context, matchResolver, xPath)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Select the best matching template from a list of templates.\r\n *\r\n * Selection rules (XSLT 3.0 spec section 6.4):\r\n * 1. Import precedence (higher wins)\r\n * 2. Effective priority (higher wins)\r\n * 3. Document order (last template wins if all else is equal)\r\n *\r\n * @param templates Array of templates with priority metadata\r\n * @param context The expression context for matching\r\n * @param matchResolver The match resolver for testing patterns\r\n * @param xPath The XPath instance for parsing\r\n * @returns The selection result\r\n */\r\nexport function selectBestTemplate(\r\n templates: TemplatePriority[],\r\n context: ExprContext,\r\n matchResolver: MatchResolver,\r\n xPath: XPath\r\n): TemplateSelectionResult {\r\n // 1. Filter to templates that match the current node\r\n const matching: TemplatePriority[] = [];\r\n const currentNode = context.nodeList[context.position];\r\n\r\n for (const t of templates) {\r\n try {\r\n if (nodeMatchesPattern(currentNode, t.matchPattern, context, matchResolver, xPath)) {\r\n matching.push(t);\r\n }\r\n } catch (e) {\r\n // If pattern matching fails, skip this template\r\n console.warn(`Failed to match pattern \"${t.matchPattern}\":`, e);\r\n }\r\n }\r\n\r\n if (matching.length === 0) {\r\n return {\r\n selectedTemplate: null,\r\n hasConflict: false,\r\n conflictingTemplates: []\r\n };\r\n }\r\n\r\n // 2. Sort by: importPrecedence DESC, effectivePriority DESC, documentOrder DESC\r\n matching.sort((a, b) => {\r\n // Higher import precedence wins\r\n if (a.importPrecedence !== b.importPrecedence) {\r\n return b.importPrecedence - a.importPrecedence;\r\n }\r\n // Higher priority wins\r\n if (a.effectivePriority !== b.effectivePriority) {\r\n return b.effectivePriority - a.effectivePriority;\r\n }\r\n // Later document order wins (last template wins)\r\n return b.documentOrder - a.documentOrder;\r\n });\r\n\r\n // 3. Detect conflicts - templates with same import precedence and priority\r\n const winner = matching[0];\r\n const conflicts = matching.filter(t =>\r\n t.importPrecedence === winner.importPrecedence &&\r\n t.effectivePriority === winner.effectivePriority\r\n );\r\n\r\n return {\r\n selectedTemplate: winner.template,\r\n hasConflict: conflicts.length > 1,\r\n conflictingTemplates: conflicts.length > 1 ? conflicts : []\r\n };\r\n}\r\n\r\n/**\r\n * Emit a warning when template conflicts are detected.\r\n *\r\n * @param result The template selection result\r\n * @param node The node being matched\r\n */\r\nexport function emitConflictWarning(result: TemplateSelectionResult, node: XNode): void {\r\n if (!result.hasConflict || result.conflictingTemplates.length < 2) {\r\n return;\r\n }\r\n\r\n const patterns = result.conflictingTemplates\r\n .map(t => `\"${t.matchPattern}\" (priority: ${t.effectivePriority})`)\r\n .join(', ');\r\n\r\n console.warn(\r\n `XSLT Warning: Ambiguous template match for node <${node.nodeName}>. ` +\r\n `Multiple templates match with equal priority: ${patterns}. ` +\r\n `Using the last one in document order.`\r\n );\r\n}\r\n","// Copyright 2023-2024 Design Liquido\r\n// Copyright 2018 Johannes Wilm\r\n// Copyright 2005 Google Inc.\r\n// All Rights Reserved\r\n//\r\n// Original author: Steffen Meschkat <mesch@google.com>\r\n\r\nimport {\r\n XDocument,\r\n XNode,\r\n XmlParser,\r\n domAppendChild,\r\n domCreateCDATASection,\r\n domCreateComment,\r\n domCreateDocumentFragment,\r\n domCreateElement,\r\n domCreateTextNode,\r\n domGetAttributeValue,\r\n domSetAttribute,\r\n xmlGetAttribute,\r\n xmlTransformedText,\r\n xmlValue,\r\n xmlValueLegacyBehavior\r\n} from '../dom';\r\nimport { ExprContext, XPath, MatchResolver } from '../xpath';\r\n\r\nimport {\r\n DOM_ATTRIBUTE_NODE,\r\n DOM_CDATA_SECTION_NODE,\r\n DOM_COMMENT_NODE,\r\n DOM_DOCUMENT_FRAGMENT_NODE,\r\n DOM_DOCUMENT_NODE,\r\n DOM_ELEMENT_NODE,\r\n DOM_TEXT_NODE\r\n} from '../constants';\r\n\r\nimport { StringValue, NodeSetValue, NodeValue } from '../xpath/values';\r\nimport { XsltOptions } from './xslt-options';\r\nimport { XsltDecimalFormatSettings } from './xslt-decimal-format-settings';\r\nimport {\r\n collectAndExpandTemplates,\r\n selectBestTemplate,\r\n emitConflictWarning\r\n} from './functions';\r\nimport { TemplatePriority } from './template-priority';\r\n\r\n/**\r\n * The main class for XSL-T processing. The implementation is NOT\r\n * complete; some xsl element are left out.\r\n *\r\n * References:\r\n *\r\n * [XSLT] XSL-T Specification\r\n * <http://www.w3.org/TR/1999/REC-xslt-19991116>.\r\n *\r\n * [ECMA] ECMAScript Language Specification\r\n * <http://www.ecma-international.org/publications/standards/Ecma-262.htm>.\r\n *\r\n * The XSL processor API has one entry point, the function\r\n * `xsltProcess()`. It receives as arguments the starting point in the\r\n * input document as an XPath expression context, the DOM root node of\r\n * the XSL-T stylesheet, and a DOM node that receives the output.\r\n *\r\n * NOTE: Actually, XSL-T processing according to the specification is\r\n * defined as operation on text documents, not as operation on DOM\r\n * trees. So, strictly speaking, this implementation is not an XSL-T\r\n * processor, but the processing engine that needs to be complemented\r\n * by an XML parser and serializer in order to be complete. Those two\r\n * are found in the `dom` folder.\r\n */\r\nexport class Xslt {\r\n xPath: XPath;\r\n xmlParser: XmlParser;\r\n matchResolver: MatchResolver;\r\n options: XsltOptions;\r\n decimalFormatSettings: XsltDecimalFormatSettings;\r\n\r\n outputDocument: XDocument;\r\n outputMethod: 'xml' | 'html' | 'text' | 'name' | 'xhtml';\r\n outputOmitXmlDeclaration: string;\r\n version: string;\r\n firstTemplateRan: boolean;\r\n\r\n /**\r\n * List of element name patterns from xsl:strip-space declarations.\r\n * Whitespace-only text nodes inside matching elements will be stripped.\r\n */\r\n stripSpacePatterns: string[];\r\n\r\n /**\r\n * List of element name patterns from xsl:preserve-space declarations.\r\n * Whitespace-only text nodes inside matching elements will be preserved.\r\n * preserve-space takes precedence over strip-space for conflicting patterns.\r\n */\r\n preserveSpacePatterns: string[];\r\n\r\n /**\r\n * Namespace aliases from xsl:namespace-alias declarations.\r\n * Maps stylesheet namespace prefixes to result namespace prefixes.\r\n */\r\n namespaceAliases: Map<string, string>;\r\n\r\n constructor(\r\n options: Partial<XsltOptions> = {\r\n cData: true,\r\n escape: true,\r\n selfClosingTags: true,\r\n parameters: []\r\n }\r\n ) {\r\n this.xPath = new XPath();\r\n this.xmlParser = new XmlParser();\r\n this.matchResolver = new MatchResolver();\r\n this.options = {\r\n cData: options.cData === true,\r\n escape: options.escape === true,\r\n selfClosingTags: options.selfClosingTags === true,\r\n parameters: options.parameters || []\r\n };\r\n this.outputMethod = 'xml';\r\n this.outputOmitXmlDeclaration = 'no';\r\n this.stripSpacePatterns = [];\r\n this.preserveSpacePatterns = [];\r\n this.namespaceAliases = new Map();\r\n this.decimalFormatSettings = {\r\n decimalSeparator: '.',\r\n groupingSeparator: ',',\r\n infinity: 'Infinity',\r\n minusSign: '-',\r\n naN: 'NaN',\r\n percent: '%',\r\n perMille: '‰',\r\n zeroDigit: '0',\r\n digit: '#',\r\n patternSeparator: ';'\r\n };\r\n this.firstTemplateRan = false;\r\n }\r\n\r\n /**\r\n * The exported entry point of the XSL-T processor.\r\n * @param xmlDoc The input document root, as DOM node.\r\n * @param stylesheet The stylesheet document root, as DOM node.\r\n * @returns the processed document, as XML text in a string.\r\n */\r\n async xsltProcess(xmlDoc: XDocument, stylesheet: XDocument) {\r\n const outputDocument = new XDocument();\r\n this.outputDocument = outputDocument;\r\n const expressionContext = new ExprContext([xmlDoc]);\r\n\r\n if (this.options.parameters.length > 0) {\r\n for (const parameter of this.options.parameters) {\r\n expressionContext.setVariable(parameter.name, new StringValue(parameter.value));\r\n }\r\n }\r\n\r\n await this.xsltProcessContext(expressionContext, stylesheet, this.outputDocument);\r\n const transformedOutputXml: string = xmlTransformedText(outputDocument, {\r\n cData: this.options.cData,\r\n escape: this.options.escape,\r\n selfClosingTags: this.options.selfClosingTags,\r\n outputMethod: this.outputMethod\r\n });\r\n\r\n return transformedOutputXml;\r\n }\r\n\r\n /**\r\n * The main entry point of the XSL-T processor, as explained on the top of the file.\r\n * @param context The input document root, as XPath `ExprContext`.\r\n * @param template The stylesheet document root, as DOM node.\r\n * @param output If set, the output where the transformation should occur.\r\n */\r\n protected async xsltProcessContext(context: ExprContext, template: XNode, output?: XNode) {\r\n if (!this.isXsltElement(template)) {\r\n await this.xsltPassThrough(context, template, output);\r\n } else {\r\n let node: XNode,\r\n select: any,\r\n value: any,\r\n nodes: XNode[];\r\n switch (template.localName) {\r\n case 'apply-imports':\r\n throw new Error(`not implemented: ${template.localName}`);\r\n case 'apply-templates':\r\n await this.xsltApplyTemplates(context, template, output);\r\n break;\r\n case 'attribute':\r\n await this.xsltAttribute(context, template, output);\r\n break;\r\n case 'attribute-set':\r\n throw new Error(`not implemented: ${template.localName}`);\r\n case 'call-template':\r\n await this.xsltCallTemplate(context, template, output);\r\n break;\r\n case 'choose':\r\n await this.xsltChoose(context, template, output);\r\n break;\r\n case 'comment':\r\n await this.xsltComment(context, template, output);\r\n break;\r\n case 'copy':\r\n node = this.xsltCopy(output || this.outputDocument, context.nodeList[context.position]);\r\n if (node) {\r\n await this.xsltChildNodes(context, template, node);\r\n }\r\n break;\r\n case 'copy-of':\r\n select = xmlGetAttribute(template, 'select');\r\n value = this.xPath.xPathEval(select, context);\r\n const destinationNode = output || this.outputDocument;\r\n if (value.type === 'node-set') {\r\n nodes = value.nodeSetValue();\r\n for (let i = 0; i < nodes.length; ++i) {\r\n this.xsltCopyOf(destinationNode, nodes[i]);\r\n }\r\n } else {\r\n let node = domCreateTextNode(this.outputDocument, value.stringValue());\r\n node.siblingPosition = destinationNode.childNodes.length;\r\n domAppendChild(destinationNode, node);\r\n }\r\n break;\r\n case 'decimal-format':\r\n this.xsltDecimalFormat(context, template);\r\n break;\r\n case 'element':\r\n await this.xsltElement(context, template, output);\r\n break;\r\n case 'fallback':\r\n throw new Error(`not implemented: ${template.localName}`);\r\n case 'for-each':\r\n await this.xsltForEach(context, template, output);\r\n break;\r\n case 'if':\r\n await this.xsltIf(context, template, output);\r\n break;\r\n case 'import':\r\n await this.xsltImport(context, template, output);\r\n break;\r\n case 'include':\r\n await this.xsltInclude(context, template, output);\r\n break;\r\n case 'key':\r\n this.xsltKey(context, template);\r\n break;\r\n case 'message':\r\n await this.xsltMessage(context, template);\r\n break;\r\n case 'namespace-alias':\r\n this.xsltNamespaceAlias(template);\r\n break;\r\n case 'number':\r\n this.xsltNumber(context, template, output);\r\n break;\r\n case 'otherwise':\r\n // xsl:otherwise is handled inside xsltChoose. If we reach here,\r\n // it means the element was used outside of xsl:choose.\r\n throw new Error(`<xsl:otherwise> must be a child of <xsl:choose>.`);\r\n case 'output':\r\n this.outputMethod = xmlGetAttribute(template, 'method') as 'xml' | 'html' | 'text' | 'name';\r\n this.outputOmitXmlDeclaration = xmlGetAttribute(template, 'omit-xml-declaration');\r\n break;\r\n case 'param':\r\n await this.xsltVariable(context, template, false);\r\n break;\r\n case 'preserve-space':\r\n this.xsltPreserveSpace(template);\r\n break;\r\n case 'processing-instruction':\r\n throw new Error(`not implemented: ${template.localName}`);\r\n case 'sort':\r\n this.xsltSort(context, template);\r\n break;\r\n case 'strip-space':\r\n this.xsltStripSpace(template);\r\n break;\r\n case 'stylesheet':\r\n case 'transform':\r\n await this.xsltTransformOrStylesheet(context, template, output);\r\n break;\r\n case 'template':\r\n await this.xsltTemplate(context, template, output);\r\n break;\r\n case 'text':\r\n this.xsltText(context, template, output);\r\n break;\r\n case 'value-of':\r\n this.xsltValueOf(context, template, output);\r\n break;\r\n case 'variable':\r\n await this.xsltVariable(context, template, true);\r\n break;\r\n case 'when':\r\n // xsl:when is handled inside xsltChoose. If we reach here,\r\n // it means the element was used outside of xsl:choose.\r\n throw new Error(`<xsl:when> must be a child of <xsl:choose>.`);\r\n case 'with-param':\r\n // xsl:with-param is handled inside xsltWithParam called from\r\n // xsltCallTemplate and xsltApplyTemplates. If we reach here,\r\n // it means the element was used outside of those contexts.\r\n throw new Error(`<xsl:with-param> must be a child of <xsl:call-template> or <xsl:apply-templates>.`);\r\n default:\r\n throw new Error(`error if here: ${template.localName}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:apply-templates`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output. Only used if there's no corresponding output node already defined.\r\n * @protected\r\n */\r\n protected async xsltApplyTemplates(context: ExprContext, template: XNode, output?: XNode) {\r\n const select = xmlGetAttribute(template, 'select');\r\n let nodes: XNode[] = [];\r\n if (select) {\r\n nodes = this.xPath.xPathEval(select, context).nodeSetValue();\r\n } else {\r\n nodes = context.nodeList[context.position].childNodes;\r\n }\r\n\r\n // TODO: Check why apply-templates was sorting and filing parameters\r\n // automatically.\r\n /* this.xsltWithParam(sortContext, template);\r\n this.xsltSort(sortContext, template); */\r\n\r\n const mode: string | null = xmlGetAttribute(template, 'mode');\r\n const top = template.ownerDocument.documentElement;\r\n\r\n // Collect all templates with their priority metadata\r\n const expandedTemplates: TemplatePriority[] = collectAndExpandTemplates(top, mode, this.xPath);\r\n\r\n // Clone context and set any xsl:with-param parameters defined on\r\n // the <xsl:apply-templates> element so they are visible to the\r\n // templates executed for each selected node.\r\n const paramContext = context.clone();\r\n await this.xsltWithParam(paramContext, template);\r\n const modifiedContext = paramContext.clone(nodes);\r\n // Process nodes in document order, selecting the BEST matching template for each node.\r\n // This is the XSLT 3.0 compliant behavior - only ONE template executes per node.\r\n for (let j = 0; j < modifiedContext.contextSize(); ++j) {\r\n const currentNode = modifiedContext.nodeList[j];\r\n\r\n // If the current node is text, there's no need to test all the templates\r\n // against it. Just appending it to its parent is fine.\r\n if (currentNode.nodeType === DOM_TEXT_NODE) {\r\n const textNodeContext = context.clone(\r\n [currentNode],\r\n 0\r\n );\r\n this.commonLogicTextNode(textNodeContext, currentNode, output);\r\n } else {\r\n // For non-text nodes, select the BEST matching template based on priority\r\n const clonedContext = modifiedContext.clone(\r\n [currentNode],\r\n 0\r\n );\r\n clonedContext.inApplyTemplates = true;\r\n\r\n // Select the best template according to XSLT conflict resolution rules\r\n const selection = selectBestTemplate(\r\n expandedTemplates,\r\n clonedContext,\r\n this.matchResolver,\r\n this.xPath\r\n );\r\n\r\n // Emit warning if there's a conflict\r\n if (selection.hasConflict) {\r\n emitConflictWarning(selection, currentNode);\r\n }\r\n\r\n // Execute ONLY the selected template (not all matching templates)\r\n // We directly execute the template children here, bypassing xsltTemplate's\r\n // own matching logic since we've already determined this is the best match.\r\n if (selection.selectedTemplate) {\r\n await this.xsltChildNodes(clonedContext, selection.selectedTemplate, output);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:attribute`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output. Only used if there's no corresponding output node already defined.\r\n * @protected\r\n */\r\n protected async xsltAttribute(context: ExprContext, template: XNode, output?: XNode) {\r\n const nameExpr = xmlGetAttribute(template, 'name');\r\n const name = this.xsltAttributeValue(nameExpr, context);\r\n\r\n const documentFragment = domCreateDocumentFragment(this.outputDocument);\r\n await this.xsltChildNodes(context, template, documentFragment);\r\n const value = xmlValueLegacyBehavior(documentFragment);\r\n\r\n if (output) {\r\n domSetAttribute(output, name, value);\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:call-template`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output, used when a fragment is passed by a previous step.\r\n */\r\n protected async xsltCallTemplate(context: ExprContext, template: XNode, output?: XNode) {\r\n const name = xmlGetAttribute(template, 'name');\r\n const top = template.ownerDocument.documentElement;\r\n\r\n const paramContext = context.clone();\r\n await this.xsltWithParam(paramContext, template);\r\n\r\n for (let i = 0; i < top.childNodes.length; ++i) {\r\n let childNode = top.childNodes[i];\r\n if (\r\n childNode.nodeType === DOM_ELEMENT_NODE &&\r\n this.isXsltElement(childNode, 'template') &&\r\n domGetAttributeValue(childNode, 'name') === name\r\n ) {\r\n await this.xsltChildNodes(paramContext, childNode, output);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:choose`, its child nodes `xsl:when`, and\r\n * `xsl:otherwise`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output. Only used if there's no corresponding output node already defined.\r\n */\r\n protected async xsltChoose(context: ExprContext, template: XNode, output?: XNode) {\r\n for (const childNode of template.childNodes) {\r\n if (childNode.nodeType !== DOM_ELEMENT_NODE) {\r\n continue;\r\n }\r\n\r\n if (this.isXsltElement(childNode, 'when')) {\r\n const test = xmlGetAttribute(childNode, 'test');\r\n if (this.xPath.xPathEval(test, context).booleanValue()) {\r\n await this.xsltChildNodes(context, childNode, output);\r\n break;\r\n }\r\n } else if (this.isXsltElement(childNode, 'otherwise')) {\r\n await this.xsltChildNodes(context, childNode, output);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:copy` for all node types.\r\n * @param {XNode} destination the node being copied to, part of output document.\r\n * @param {XNode} source the node being copied, part in input document.\r\n * @returns {XNode|null} If an element node was created, the element node. Otherwise, null.\r\n */\r\n protected xsltCopy(destination: XNode, source: XNode): XNode {\r\n if (source.nodeType == DOM_ELEMENT_NODE) {\r\n let node = domCreateElement(this.outputDocument, source.nodeName);\r\n // node.transformedNodeName = source.nodeName;\r\n if (source.namespaceUri !== null && source.namespaceUri !== undefined) {\r\n domSetAttribute(node, 'xmlns', source.namespaceUri);\r\n }\r\n // Set siblingPosition to preserve insertion order during serialization\r\n node.siblingPosition = destination.childNodes.length;\r\n domAppendChild(destination, node);\r\n return node;\r\n }\r\n\r\n if (source.nodeType == DOM_TEXT_NODE) {\r\n // Check if this whitespace-only text node should be stripped\r\n if (this.shouldStripWhitespaceNode(source)) {\r\n return null;\r\n }\r\n let node = domCreateTextNode(this.outputDocument, source.nodeValue);\r\n node.siblingPosition = destination.childNodes.length;\r\n domAppendChild(destination, node);\r\n } else if (source.nodeType == DOM_CDATA_SECTION_NODE) {\r\n let node = domCreateCDATASection(this.outputDocument, source.nodeValue);\r\n node.siblingPosition = destination.childNodes.length;\r\n domAppendChild(destination, node);\r\n } else if (source.nodeType == DOM_COMMENT_NODE) {\r\n let node = domCreateComment(this.outputDocument, source.nodeValue);\r\n node.siblingPosition = destination.childNodes.length;\r\n domAppendChild(destination, node);\r\n } else if (source.nodeType == DOM_ATTRIBUTE_NODE) {\r\n domSetAttribute(destination, source.nodeName, source.nodeValue);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Implements `xsl:comment`. \r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output. Only used if there's no corresponding output node already defined. \r\n */\r\n protected async xsltComment(context: ExprContext, template: XNode, output?: XNode) {\r\n const node = domCreateDocumentFragment(this.outputDocument);\r\n await this.xsltChildNodes(context, template, node);\r\n const commentData = xmlValue(node);\r\n const commentNode = domCreateComment(this.outputDocument, commentData);\r\n const resolvedOutput = output || this.outputDocument;\r\n resolvedOutput.appendChild(commentNode);\r\n }\r\n\r\n /**\r\n * Implements `xsl:copy-of` for node-set values of the select\r\n * expression. Recurses down the source node tree, which is part of\r\n * the input document.\r\n * @param {XNode} destination the node being copied to, part of output document.\r\n * @param {XNode} source the node being copied, part in input document.\r\n */\r\n protected xsltCopyOf(destination: XNode, source: XNode): void {\r\n if (source.nodeType == DOM_DOCUMENT_FRAGMENT_NODE || source.nodeType == DOM_DOCUMENT_NODE) {\r\n for (let i = 0; i < source.childNodes.length; ++i) {\r\n this.xsltCopyOf(destination, source.childNodes[i]);\r\n }\r\n } else {\r\n const node = this.xsltCopy(destination, source);\r\n if (node) {\r\n for (let i = 0; i < source.childNodes.length; ++i) {\r\n this.xsltCopyOf(node, source.childNodes[i]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:decimal-format`, registering the settings in this instance\r\n * and the current context. \r\n * @param context The Expression Context.\r\n * @param template The template.\r\n */\r\n protected xsltDecimalFormat(context: ExprContext, template: XNode) {\r\n const name = xmlGetAttribute(template, 'name');\r\n const decimalSeparator = xmlGetAttribute(template, 'decimal-separator');\r\n const groupingSeparator = xmlGetAttribute(template, 'grouping-separator');\r\n const infinity = xmlGetAttribute(template, 'infinity');\r\n const minusSign = xmlGetAttribute(template, 'minus-sign');\r\n const naN = xmlGetAttribute(template, 'NaN');\r\n const percent = xmlGetAttribute(template, 'percent');\r\n const perMille = xmlGetAttribute(template, 'per-mille');\r\n const zeroDigit = xmlGetAttribute(template, 'zero-digit');\r\n const digit = xmlGetAttribute(template, 'digit');\r\n const patternSeparator = xmlGetAttribute(template, 'pattern-separator');\r\n this.decimalFormatSettings = {\r\n name: name || this.decimalFormatSettings.name,\r\n decimalSeparator: decimalSeparator || this.decimalFormatSettings.decimalSeparator,\r\n groupingSeparator: groupingSeparator || this.decimalFormatSettings.groupingSeparator,\r\n infinity: infinity || this.decimalFormatSettings.infinity,\r\n minusSign: minusSign || this.decimalFormatSettings.minusSign,\r\n naN: naN || this.decimalFormatSettings.naN,\r\n percent: percent || this.decimalFormatSettings.percent,\r\n perMille: perMille || this.decimalFormatSettings.perMille,\r\n zeroDigit: zeroDigit || this.decimalFormatSettings.zeroDigit,\r\n digit: digit || this.decimalFormatSettings.digit,\r\n patternSeparator: patternSeparator || this.decimalFormatSettings.patternSeparator\r\n };\r\n context.decimalFormatSettings = this.decimalFormatSettings;\r\n }\r\n\r\n /**\r\n * Implements `xsl:element`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n */\r\n protected async xsltElement(context: ExprContext, template: XNode, output?: XNode) {\r\n const nameExpr = xmlGetAttribute(template, 'name');\r\n const name = this.xsltAttributeValue(nameExpr, context);\r\n const node = domCreateElement(this.outputDocument, name);\r\n\r\n // node.transformedNodeName = name;\r\n\r\n domAppendChild(output || this.outputDocument, node);\r\n // The element becomes the output node of the source node.\r\n // context.nodeList[context.position].outputNode = node;\r\n const clonedContext = context.clone(undefined, 0);\r\n await this.xsltChildNodes(clonedContext, template, node);\r\n }\r\n\r\n /**\r\n * Implements `xsl:for-each`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output.\r\n */\r\n protected async xsltForEach(context: ExprContext, template: XNode, output?: XNode) {\r\n const select = xmlGetAttribute(template, 'select');\r\n const nodes = this.xPath.xPathEval(select, context).nodeSetValue();\r\n if (nodes.length === 0) {\r\n return;\r\n }\r\n\r\n // TODO: Why do we need this sort, really?\r\n // I have no idea why this logic is here (it was implemented\r\n // before Design Liquido taking over), so if it is proven not useful,\r\n // this entire logic must be removed.\r\n const sortContext = context.clone(nodes);\r\n this.xsltSort(sortContext, template);\r\n\r\n const nodesWithParent = sortContext.nodeList.filter((n) => n.parentNode !== null && n.parentNode !== undefined);\r\n if (nodesWithParent.length <= 0) {\r\n throw new Error('Nodes with no parents defined.');\r\n }\r\n\r\n for (let i = 0; i < sortContext.contextSize(); ++i) {\r\n await this.xsltChildNodes(sortContext.clone(sortContext.nodeList, i), template, output);\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:if`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output.\r\n */\r\n protected async xsltIf(context: ExprContext, template: XNode, output?: XNode) {\r\n const test = xmlGetAttribute(template, 'test');\r\n if (this.xPath.xPathEval(test, context).booleanValue()) {\r\n await this.xsltChildNodes(context, template, output);\r\n }\r\n }\r\n\r\n /**\r\n * Common implementation for `<xsl:import>` and `<xsl:include>`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output.\r\n * @param isImport Whether this is an import (true) or include (false).\r\n */\r\n protected async xsltImportOrInclude(context: ExprContext, template: XNode, output: XNode | undefined, isImport: boolean) {\r\n const elementName = isImport ? 'xsl:import' : 'xsl:include';\r\n const [major, minor] = process.versions.node.split('.').map(Number);\r\n if (major <= 17 && minor < 5) {\r\n throw new Error(`Your Node.js version does not support \\`<${elementName}>\\`. If possible, please update your Node.js version to at least version 17.5.0.`);\r\n }\r\n\r\n // We need to test here whether `window.fetch` is available or not.\r\n // If it is a browser environemnt, it should be.\r\n // Otherwise, we will need to import an equivalent library, like 'node-fetch'.\r\n if (!global.globalThis.fetch) {\r\n global.globalThis.fetch = fetch as any;\r\n global.globalThis.Headers = Headers as any;\r\n global.globalThis.Request = Request as any;\r\n global.globalThis.Response = Response as any;\r\n }\r\n\r\n const hrefAttributeFind = template.childNodes.filter(n => n.nodeName === 'href');\r\n if (hrefAttributeFind.length <= 0) {\r\n throw new Error(`<${elementName}> with no href attribute defined.`);\r\n }\r\n\r\n const hrefAttribute = hrefAttributeFind[0];\r\n\r\n const fetchTest = await global.globalThis.fetch(hrefAttribute.nodeValue);\r\n const fetchResponse = await fetchTest.text();\r\n const includedXslt = this.xmlParser.xmlParse(fetchResponse);\r\n await this.xsltChildNodes(context, includedXslt.childNodes[0], output);\r\n }\r\n\r\n /**\r\n * Implements `<xsl:import>`. For now the code is nearly identical to `<xsl:include>`, but there's\r\n * no precedence evaluation implemented yet.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output.\r\n */\r\n protected async xsltImport(context: ExprContext, template: XNode, output?: XNode) {\r\n await this.xsltImportOrInclude(context, template, output, true);\r\n }\r\n\r\n /**\r\n * Implements `xsl:include`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n * @param output The output.\r\n */\r\n protected async xsltInclude(context: ExprContext, template: XNode, output?: XNode) {\r\n await this.xsltImportOrInclude(context, template, output, false);\r\n }\r\n\r\n /**\r\n * Implements `xsl:key`.\r\n * @param context The Expression Context.\r\n * @param template The template.\r\n */\r\n protected xsltKey(context: ExprContext, template: XNode) {\r\n // `name`, `match`, and `use` are required.\r\n const name: string = xmlGetAttribute(template, 'name');\r\n const match: string = xmlGetAttribute(template, 'match');\r\n const use: string = xmlGetAttribute(template, 'use');\r\n\r\n if (!name || !match || !use) {\r\n let errorMessage = '<xsl:key> missing required parameters: ';\r\n if (!name) {\r\n errorMessage += 'name, ';\r\n }\r\n\r\n if (!match) {\r\n errorMessage += 'match, ';\r\n }\r\n\r\n if (!use) {\r\n errorMessage += 'use, ';\r\n }\r\n\r\n errorMessage = errorMessage.slice(0, -2);\r\n throw new Error(errorMessage);\r\n }\r\n\r\n let keyContext: ExprContext;\r\n if (context.nodeList[context.position].nodeName === '#document') {\r\n keyContext = context.clone(context.nodeList[context.position].childNodes);\r\n } else {\r\n keyContext = context;\r\n }\r\n\r\n const nodes = this.xsltMatch(match, keyContext);\r\n if (!(name in context.keys)) {\r\n context.keys[name] = {};\r\n }\r\n\r\n for (const node of nodes) {\r\n const nodeContext = context.clone([node]);\r\n const attribute = this.xPath.xPathEval(use, nodeContext);\r\n const attributeValue = attribute.stringValue();\r\n context.keys[name][attributeValue] = new NodeSetValue([node]);\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:message`.\r\n * Outputs a message to the console. If terminate=\"yes\", throws an error to stop processing.\r\n * @param context The Expression Context.\r\n * @param template The `<xsl:message>` node.\r\n */\r\n protected async xsltMessage(context: ExprContext, template: XNode) {\r\n // Build the message content by processing child nodes\r\n const documentFragment = domCreateDocumentFragment(this.outputDocument);\r\n await this.xsltChildNodes(context, template, documentFragment);\r\n const messageText = xmlValue(documentFragment);\r\n\r\n // Check the terminate attribute\r\n const terminate = xmlGetAttribute(template, 'terminate') || 'no';\r\n\r\n // Output the message to console\r\n console.log(`[xsl:message] ${messageText}`);\r\n\r\n // If terminate=\"yes\", stop processing by throwing an error\r\n if (terminate === 'yes') {\r\n throw new Error(`xsl:message terminated: ${messageText}`);\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:namespace-alias`.\r\n * Declares that a namespace URI in the stylesheet should be replaced by a different\r\n * namespace URI in the output.\r\n * @param template The `<xsl:namespace-alias>` node.\r\n */\r\n protected xsltNamespaceAlias(template: XNode) {\r\n const stylesheetPrefix = xmlGetAttribute(template, 'stylesheet-prefix');\r\n const resultPrefix = xmlGetAttribute(template, 'result-prefix');\r\n\r\n if (!stylesheetPrefix || !resultPrefix) {\r\n throw new Error('<xsl:namespace-alias> requires both stylesheet-prefix and result-prefix attributes.');\r\n }\r\n\r\n // Store the alias mapping\r\n // \"#default\" represents the default namespace (no prefix)\r\n this.namespaceAliases.set(stylesheetPrefix, resultPrefix);\r\n }\r\n\r\n /**\r\n * Implements `xsl:number`.\r\n * Inserts a formatted number into the result tree.\r\n * @param context The Expression Context.\r\n * @param template The `<xsl:number>` node.\r\n * @param output The output node.\r\n */\r\n protected xsltNumber(context: ExprContext, template: XNode, output?: XNode) {\r\n const value = xmlGetAttribute(template, 'value');\r\n const level = xmlGetAttribute(template, 'level') || 'single';\r\n const count = xmlGetAttribute(template, 'count');\r\n const from = xmlGetAttribute(template, 'from');\r\n const format = xmlGetAttribute(template, 'format') || '1';\r\n const lang = xmlGetAttribute(template, 'lang');\r\n const letterValue = xmlGetAttribute(template, 'letter-value');\r\n const groupingSeparator = xmlGetAttribute(template, 'grouping-separator');\r\n const groupingSize = xmlGetAttribute(template, 'grouping-size');\r\n\r\n let number: number;\r\n\r\n if (value) {\r\n // If value attribute is present, evaluate it as an XPath expression\r\n const result = this.xPath.xPathEval(value, context);\r\n number = Math.round(result.numberValue());\r\n } else {\r\n // Otherwise, count nodes based on level, count, and from attributes\r\n number = this.xsltNumberCount(context, level, count, from);\r\n }\r\n\r\n // Format the number\r\n const formattedNumber = this.xsltFormatNumber(number, format, groupingSeparator, groupingSize);\r\n\r\n // Create text node with the formatted number\r\n const textNode = domCreateTextNode(this.outputDocument, formattedNumber);\r\n const targetOutput = output || this.outputDocument;\r\n textNode.siblingPosition = targetOutput.childNodes.length;\r\n domAppendChild(targetOutput, textNode);\r\n }\r\n\r\n /**\r\n * Counts nodes for xsl:number based on level, count, and from attributes.\r\n * @param context The Expression Context.\r\n * @param level The counting level: 'single', 'multiple', or 'any'.\r\n * @param count Pattern to match nodes to count.\r\n * @param from Pattern to start counting from.\r\n * @returns The count value.\r\n */\r\n protected xsltNumberCount(context: ExprContext, level: string, count: string | null, from: string | null): number {\r\n const currentNode = context.nodeList[context.position];\r\n\r\n // Default count pattern matches nodes with the same name and type as current node\r\n const countPattern = count || currentNode.nodeName;\r\n\r\n switch (level) {\r\n case 'single': {\r\n // Count preceding siblings (plus 1 for self) that match the count pattern\r\n let num = 1;\r\n let sibling = currentNode.previousSibling;\r\n while (sibling) {\r\n if (sibling.nodeType === currentNode.nodeType) {\r\n if (this.nodeMatchesPattern(sibling, countPattern)) {\r\n num++;\r\n }\r\n }\r\n sibling = sibling.previousSibling;\r\n }\r\n return num;\r\n }\r\n case 'multiple': {\r\n // For multiple level, we'd return a sequence - simplified to single value here\r\n // Full implementation would return array for hierarchical numbering\r\n let num = 1;\r\n let sibling = currentNode.previousSibling;\r\n while (sibling) {\r\n if (sibling.nodeType === currentNode.nodeType) {\r\n if (this.nodeMatchesPattern(sibling, countPattern)) {\r\n num++;\r\n }\r\n }\r\n sibling = sibling.previousSibling;\r\n }\r\n return num;\r\n }\r\n case 'any': {\r\n // Count all preceding nodes in document order that match\r\n let num = 1;\r\n const allNodes = this.getAllPrecedingNodes(currentNode);\r\n for (const node of allNodes) {\r\n if (this.nodeMatchesPattern(node, countPattern)) {\r\n num++;\r\n }\r\n }\r\n return num;\r\n }\r\n default:\r\n return 1;\r\n }\r\n }\r\n\r\n /**\r\n * Checks if a node matches a simple name pattern.\r\n * @param node The node to check.\r\n * @param pattern The pattern (node name) to match.\r\n * @returns True if the node matches.\r\n */\r\n protected nodeMatchesPattern(node: XNode, pattern: string): boolean {\r\n if (pattern === '*') {\r\n return node.nodeType === DOM_ELEMENT_NODE;\r\n }\r\n return node.nodeName === pattern || node.localName === pattern;\r\n }\r\n\r\n /**\r\n * Gets all nodes preceding the given node in document order.\r\n * @param node The reference node.\r\n * @returns Array of preceding nodes.\r\n */\r\n protected getAllPrecedingNodes(node: XNode): XNode[] {\r\n const result: XNode[] = [];\r\n\r\n // Get preceding siblings\r\n let sibling = node.previousSibling;\r\n while (sibling) {\r\n result.push(sibling);\r\n // Add descendants of preceding siblings\r\n this.collectDescendants(sibling, result);\r\n sibling = sibling.previousSibling;\r\n }\r\n\r\n // Get ancestors' preceding siblings\r\n let parent = node.parentNode;\r\n while (parent) {\r\n let parentSibling = parent.previousSibling;\r\n while (parentSibling) {\r\n result.push(parentSibling);\r\n this.collectDescendants(parentSibling, result);\r\n parentSibling = parentSibling.previousSibling;\r\n }\r\n parent = parent.parentNode;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Collects all descendant nodes of a given node.\r\n * @param node The parent node.\r\n * @param result The array to collect into.\r\n */\r\n protected collectDescendants(node: XNode, result: XNode[]): void {\r\n for (const child of node.childNodes) {\r\n if (child.nodeType === DOM_ELEMENT_NODE) {\r\n result.push(child);\r\n this.collectDescendants(child, result);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Formats a number according to the format string.\r\n * @param number The number to format.\r\n * @param format The format string (e.g., \"1\", \"01\", \"a\", \"A\", \"i\", \"I\").\r\n * @param groupingSeparator Optional grouping separator.\r\n * @param groupingSize Optional grouping size.\r\n * @returns The formatted number string.\r\n */\r\n protected xsltFormatNumber(\r\n number: number,\r\n format: string,\r\n groupingSeparator: string | null,\r\n groupingSize: string | null\r\n ): string {\r\n // Handle different format tokens\r\n const formatChar = format.charAt(0);\r\n\r\n let result: string;\r\n\r\n switch (formatChar) {\r\n case '1':\r\n result = number.toString();\r\n // Handle zero-padding (e.g., \"01\" -> \"01\", \"02\", etc.)\r\n if (format.length > 1 && format.match(/^0+1$/)) {\r\n const width = format.length;\r\n result = number.toString().padStart(width, '0');\r\n }\r\n break;\r\n case 'a':\r\n // Lowercase alphabetic: a, b, c, ..., z, aa, ab, ...\r\n result = this.numberToAlpha(number, false);\r\n break;\r\n case 'A':\r\n // Uppercase alphabetic: A, B, C, ..., Z, AA, AB, ...\r\n result = this.numberToAlpha(number, true);\r\n break;\r\n case 'i':\r\n // Lowercase Roman numerals\r\n result = this.numberToRoman(number).toLowerCase();\r\n break;\r\n case 'I':\r\n // Uppercase Roman numerals\r\n result = this.numberToRoman(number);\r\n break;\r\n default:\r\n result = number.toString();\r\n }\r\n\r\n // Apply grouping if specified\r\n if (groupingSeparator && groupingSize) {\r\n const size = parseInt(groupingSize, 10);\r\n if (size > 0 && !isNaN(size)) {\r\n result = this.applyGrouping(result, groupingSeparator, size);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts a number to alphabetic representation.\r\n * @param number The number to convert.\r\n * @param uppercase Whether to use uppercase letters.\r\n * @returns The alphabetic representation.\r\n */\r\n protected numberToAlpha(number: number, uppercase: boolean): string {\r\n if (number <= 0) return '';\r\n\r\n let result = '';\r\n while (number > 0) {\r\n number--;\r\n result = String.fromCharCode((number % 26) + (uppercase ? 65 : 97)) + result;\r\n number = Math.floor(number / 26);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts a number to Roman numeral representation.\r\n * @param number The number to convert.\r\n * @returns The Roman numeral string.\r\n */\r\n protected numberToRoman(number: number): string {\r\n if (number <= 0 || number > 3999) return number.toString();\r\n\r\n const romanNumerals: [number, string][] = [\r\n [1000, 'M'], [900, 'CM'], [500, 'D'], [400, 'CD'],\r\n [100, 'C'], [90, 'XC'], [50, 'L'], [40, 'XL'],\r\n [10, 'X'], [9, 'IX'], [5, 'V'], [4, 'IV'], [1, 'I']\r\n ];\r\n\r\n let result = '';\r\n for (const [value, numeral] of romanNumerals) {\r\n while (number >= value) {\r\n result += numeral;\r\n number -= value;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Applies grouping separators to a numeric string.\r\n * @param numStr The numeric string.\r\n * @param separator The grouping separator.\r\n * @param size The grouping size.\r\n * @returns The grouped string.\r\n */\r\n protected applyGrouping(numStr: string, separator: string, size: number): string {\r\n // Only apply to the integer part\r\n const parts = numStr.split('.');\r\n let intPart = parts[0];\r\n const decPart = parts[1];\r\n\r\n // Apply grouping from right to left\r\n let result = '';\r\n let count = 0;\r\n for (let i = intPart.length - 1; i >= 0; i--) {\r\n if (count > 0 && count % size === 0) {\r\n result = separator + result;\r\n }\r\n result = intPart[i] + result;\r\n count++;\r\n }\r\n\r\n return decPart ? result + '.' + decPart : result;\r\n }\r\n\r\n /**\r\n * Orders the current node list in the input context according to the\r\n * sort order specified by xsl:sort child nodes of the current\r\n * template node. This happens before the operation specified by the\r\n * current template node is executed.\r\n * @param context The expression context.\r\n * @param template The template node.\r\n * @todo case-order is not implemented.\r\n */\r\n protected xsltSort(context: ExprContext, template: XNode) {\r\n const sort: any[] = [];\r\n\r\n for (const childNode of template.childNodes) {\r\n if (childNode.nodeType == DOM_ELEMENT_NODE && this.isXsltElement(childNode, 'sort')) {\r\n const select = xmlGetAttribute(childNode, 'select');\r\n const expression = this.xPath.xPathParse(select);\r\n const type = xmlGetAttribute(childNode, 'data-type') || 'text';\r\n const order = xmlGetAttribute(childNode, 'order') || 'ascending';\r\n sort.push({\r\n expr: expression,\r\n type,\r\n order\r\n });\r\n }\r\n }\r\n\r\n this.xPath.xPathSort(context, sort);\r\n }\r\n\r\n /**\r\n * Implements `xsl:strip-space`.\r\n * Collects element name patterns for which whitespace-only text nodes should be stripped.\r\n * @param template The `<xsl:strip-space>` node.\r\n */\r\n protected xsltStripSpace(template: XNode) {\r\n const elements = xmlGetAttribute(template, 'elements');\r\n if (elements) {\r\n // Split on whitespace to get individual patterns (e.g., \"* book\" becomes [\"*\", \"book\"])\r\n const patterns = elements.trim().split(/\\s+/);\r\n this.stripSpacePatterns.push(...patterns);\r\n }\r\n }\r\n\r\n /**\r\n * Implements `xsl:preserve-space`.\r\n * Collects element name patterns for which whitespace-only text nodes should be preserved.\r\n * preserve-space takes precedence over strip-space for matching elements.\r\n * @param template The `<xsl:preserve-space>` node.\r\n */\r\n protected xsltPreserveSpace(template: XNode) {\r\n const elements = xmlGetAttribute(template, 'elements');\r\n if (elements) {\r\n // Split on whitespace to get individual patterns (e.g., \"pre code\" becomes [\"pre\", \"code\"])\r\n const patterns = elements.trim().split(/\\s+/);\r\n this.preserveSpacePatterns.push(...patterns);\r\n }\r\n }\r\n\r\n /**\r\n * Determines if a text node from the input document should be stripped.\r\n * This applies xsl:strip-space and xsl:preserve-space rules to whitespace-only text nodes.\r\n * @param textNode The text node to check.\r\n * @returns True if the text node should be stripped (not included in output).\r\n */\r\n protected shouldStripWhitespaceNode(textNode: XNode): boolean {\r\n // Only strip whitespace-only text nodes\r\n if (!textNode.nodeValue || !textNode.nodeValue.match(/^\\s*$/)) {\r\n return false;\r\n }\r\n\r\n // If no strip-space patterns are defined, don't strip\r\n if (this.stripSpacePatterns.length === 0) {\r\n return false;\r\n }\r\n\r\n const parentElement = textNode.parentNode;\r\n if (!parentElement || parentElement.nodeType !== DOM_ELEMENT_NODE) {\r\n return false;\r\n }\r\n\r\n // Check for xml:space=\"preserve\" on parent or ancestors (highest precedence)\r\n let ancestor = parentElement;\r\n while (ancestor && ancestor.nodeType === DOM_ELEMENT_NODE) {\r\n const xmlspace = domGetAttributeValue(ancestor, 'xml:space');\r\n if (xmlspace === 'preserve') {\r\n return false;\r\n }\r\n if (xmlspace === 'default') {\r\n break; // Continue to check strip-space/preserve-space rules\r\n }\r\n ancestor = ancestor.parentNode;\r\n }\r\n\r\n const parentName = parentElement.localName || parentElement.nodeName;\r\n\r\n // Check preserve-space patterns first (they take precedence over strip-space)\r\n for (const pattern of this.preserveSpacePatterns) {\r\n if (this.matchesNamePattern(parentName, pattern, parentElement)) {\r\n return false;\r\n }\r\n }\r\n\r\n // Check strip-space patterns\r\n for (const pattern of this.stripSpacePatterns) {\r\n if (this.matchesNamePattern(parentName, pattern, parentElement)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Matches an element name against a strip-space/preserve-space pattern.\r\n * Supports:\r\n * - \"*\" matches any element\r\n * - \"prefix:*\" matches any element in a namespace\r\n * - \"name\" matches elements with that local name\r\n * - \"prefix:name\" matches elements with that QName\r\n * @param elementName The local name of the element.\r\n * @param pattern The pattern to match against.\r\n * @param element The element node (for namespace checking).\r\n * @returns True if the element matches the pattern.\r\n */\r\n protected matchesNamePattern(elementName: string, pattern: string, element: XNode): boolean {\r\n // Universal match\r\n if (pattern === '*') {\r\n return true;\r\n }\r\n\r\n // Handle patterns with namespace prefixes\r\n if (pattern.includes(':')) {\r\n const [prefix, localPart] = pattern.split(':');\r\n\r\n // Check if element has a matching prefix\r\n const elementPrefix = element.prefix || '';\r\n\r\n if (localPart === '*') {\r\n // prefix:* - match any element in that namespace\r\n return elementPrefix === prefix;\r\n } else {\r\n // prefix:name - match specific element in namespace\r\n return elementPrefix === prefix && elementName === localPart;\r\n }\r\n }\r\n\r\n // Simple name match (no namespace prefix in pattern)\r\n return elementName === pattern;\r\n }\r\n\r\n /**\r\n * Implements `xsl:template`.\r\n * @param context The Expression Context.\r\n * @param template The `<xsl:template>` node.\r\n * @param output The output. In general, a fragment that will be used by \r\n * the caller.\r\n */\r\n protected async xsltTemplate(context: ExprContext, template: XNode, output?: XNode) {\r\n // If `<xsl:template>` is executed outside `<xsl:apply-templates>`,\r\n // only one match is accepted per level (or per context here).\r\n if (!context.inApplyTemplates && context.baseTemplateMatched) {\r\n return;\r\n }\r\n\r\n const match = xmlGetAttribute(template, 'match');\r\n if (!match) return;\r\n\r\n // XPath doesn't have an axis to select \"self and siblings\", and\r\n // the default axis is \"child\", so to select the correct children\r\n // in relative path, we force a 'self-and-siblings' axis.\r\n const nodes = this.xsltMatch(match, context, 'self-and-siblings');\r\n if (nodes.length > 0) {\r\n this.firstTemplateRan = true;\r\n if (!context.inApplyTemplates) {\r\n context.baseTemplateMatched = true;\r\n }\r\n\r\n const templateContext = context.clone(nodes, 0);\r\n await this.xsltChildNodes(templateContext, template, output);\r\n }\r\n }\r\n\r\n protected xsltText(context: ExprContext, template: XNode, output?: XNode) {\r\n const text = xmlValue(template);\r\n const node = domCreateTextNode(this.outputDocument, text);\r\n const disableOutputEscaping = template.childNodes.filter(\r\n (a) => a.nodeType === DOM_ATTRIBUTE_NODE && a.nodeName === 'disable-output-escaping'\r\n );\r\n if (disableOutputEscaping.length > 0 && disableOutputEscaping[0].nodeValue === 'yes') {\r\n node.escape = false;\r\n }\r\n const destinationTextNode = output || this.outputDocument;\r\n destinationTextNode.appendChild(node);\r\n }\r\n\r\n /**\r\n * Implements `<xsl:stylesheet>` and `<xsl:transform>`, and its corresponding\r\n * validations.\r\n * @param context The Expression Context.\r\n * @param template The `<xsl:stylesheet>` or `<xsl:transform>` node.\r\n * @param output The output. In general, a fragment that will be used by\r\n * the caller.\r\n */\r\n protected async xsltTransformOrStylesheet(context: ExprContext, template: XNode, output?: XNode): Promise<void> {\r\n for (let stylesheetAttribute of template.childNodes.filter((n) => n.nodeType === DOM_ATTRIBUTE_NODE)) {\r\n switch (stylesheetAttribute.nodeName) {\r\n case 'version':\r\n this.version = stylesheetAttribute.nodeValue;\r\n if (!['1.0', '2.0', '3.0'].includes(this.version)) {\r\n throw new Error(\r\n `XSLT version not defined or invalid. Actual resolved version: ${this.version || '(none)'}.`\r\n );\r\n }\r\n context.xsltVersion = this.version as any;\r\n break;\r\n default:\r\n if (stylesheetAttribute.prefix === 'xmlns') {\r\n context.knownNamespaces[stylesheetAttribute.localName] = stylesheetAttribute.nodeValue;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Validate that xsl:import elements are the first children (before any other elements)\r\n let importsDone = false;\r\n for (const child of template.childNodes) {\r\n if (child.nodeType === DOM_ELEMENT_NODE) {\r\n if (this.isXsltElement(child, 'import')) {\r\n if (importsDone) {\r\n throw new Error('<xsl:import> should be the first child node of <xsl:stylesheet> or <xsl:transform>.');\r\n }\r\n } else {\r\n importsDone = true;\r\n }\r\n }\r\n }\r\n\r\n // Separate templates from other stylesheet children (output, variable, key, etc.)\r\n const nonTemplates: XNode[] = [];\r\n const templates: XNode[] = [];\r\n\r\n for (const child of template.childNodes) {\r\n if (child.nodeType === DOM_ELEMENT_NODE && this.isXsltElement(child, 'template')) {\r\n templates.push(child);\r\n } else {\r\n nonTemplates.push(child);\r\n }\r\n }\r\n\r\n // Process non-template children first (declarations like output, variable, key, etc.)\r\n const contextClone = context.clone();\r\n for (const child of nonTemplates) {\r\n await this.xsltProcessContext(contextClone, child, output);\r\n }\r\n\r\n // Now select and execute the best matching template using priority rules\r\n if (templates.length > 0) {\r\n const expandedTemplates = collectAndExpandTemplates(template, null, this.xPath);\r\n\r\n // Find all (template, matchedNodes) pairs by testing each template's pattern\r\n const matchCandidates: { priority: TemplatePriority; matchedNodes: XNode[] }[] = [];\r\n\r\n for (const t of expandedTemplates) {\r\n try {\r\n // For initial template selection, evaluate patterns from document root\r\n // without axis override to ensure consistent matching for all patterns\r\n // For initial template selection, evaluate patterns from document root\r\n // without axis override to ensure consistent matching for all patterns\r\n const matchedNodes = this.xsltMatch(t.matchPattern, contextClone);\r\n if (matchedNodes.length > 0) {\r\n matchCandidates.push({ priority: t, matchedNodes });\r\n }\r\n } catch (e) {\r\n // If pattern parsing fails, skip this template\r\n console.warn(`Failed to match pattern \"${t.matchPattern}\":`, e);\r\n }\r\n }\r\n\r\n if (matchCandidates.length > 0) {\r\n // Sort by: importPrecedence DESC, effectivePriority DESC, documentOrder DESC\r\n matchCandidates.sort((a, b) => {\r\n if (a.priority.importPrecedence !== b.priority.importPrecedence) {\r\n return b.priority.importPrecedence - a.priority.importPrecedence;\r\n }\r\n if (a.priority.effectivePriority !== b.priority.effectivePriority) {\r\n return b.priority.effectivePriority - a.priority.effectivePriority;\r\n }\r\n return b.priority.documentOrder - a.priority.documentOrder;\r\n });\r\n\r\n // Detect conflicts\r\n const winner = matchCandidates[0];\r\n const conflicts = matchCandidates.filter(t =>\r\n t.priority.importPrecedence === winner.priority.importPrecedence &&\r\n t.priority.effectivePriority === winner.priority.effectivePriority\r\n );\r\n\r\n if (conflicts.length > 1) {\r\n const patterns = conflicts\r\n .map(t => `\"${t.priority.matchPattern}\" (priority: ${t.priority.effectivePriority})`)\r\n .join(', ');\r\n console.warn(\r\n `XSLT Warning: Ambiguous template match. ` +\r\n `Multiple templates match with equal priority: ${patterns}. ` +\r\n `Using the last one in document order.`\r\n );\r\n }\r\n\r\n // Execute ONLY the selected template\r\n this.firstTemplateRan = true;\r\n contextClone.baseTemplateMatched = true;\r\n const templateContext = contextClone.clone(winner.matchedNodes, 0);\r\n await this.xsltChildNodes(templateContext, winner.priority.template, output);\r\n } else {\r\n // No template matched the root element.\r\n // Apply the default XSLT behavior: process child nodes\r\n const rootNode = context.nodeList[context.position];\r\n if (rootNode && rootNode.childNodes && rootNode.childNodes.length > 0) {\r\n // Filter out DTD sections and apply templates to remaining children\r\n const childNodes = rootNode.childNodes.filter((n: XNode) => n.nodeName !== '#dtd-section');\r\n if (childNodes.length > 0) {\r\n const childContext = context.clone(childNodes);\r\n // Process each child node using xsltApplyTemplates logic\r\n for (let j = 0; j < childContext.contextSize(); ++j) {\r\n const currentNode = childContext.nodeList[j];\r\n\r\n if (currentNode.nodeType === DOM_TEXT_NODE) {\r\n const textNodeContext = context.clone([currentNode], 0);\r\n this.commonLogicTextNode(textNodeContext, currentNode, output);\r\n } else {\r\n const clonedContext = childContext.clone([currentNode], 0);\r\n const selection = selectBestTemplate(\r\n expandedTemplates,\r\n clonedContext,\r\n this.matchResolver,\r\n this.xPath\r\n );\r\n\r\n if (selection.selectedTemplate) {\r\n const templateContext = clonedContext.clone([currentNode], 0);\r\n templateContext.inApplyTemplates = true;\r\n await this.xsltChildNodes(templateContext, selection.selectedTemplate, output);\r\n } else {\r\n // If no template matches this child, recursively process its children\r\n if (currentNode.childNodes && currentNode.childNodes.length > 0) {\r\n const grandchildNodes = currentNode.childNodes.filter((n: XNode) => n.nodeName !== '#dtd-section');\r\n if (grandchildNodes.length > 0) {\r\n const grandchildContext = context.clone(grandchildNodes);\r\n // Recursively process grandchildren\r\n for (let k = 0; k < grandchildContext.contextSize(); ++k) {\r\n const grandchildNode = grandchildContext.nodeList[k];\r\n if (grandchildNode.nodeType === DOM_TEXT_NODE) {\r\n const textNodeContext = context.clone([grandchildNode], 0);\r\n this.commonLogicTextNode(textNodeContext, grandchildNode, output);\r\n } else {\r\n const grandchildClonedContext = grandchildContext.clone([grandchildNode], 0);\r\n const grandchildSelection = selectBestTemplate(\r\n expandedTemplates,\r\n grandchildClonedContext,\r\n this.matchResolver,\r\n this.xPath\r\n );\r\n if (grandchildSelection.selectedTemplate) {\r\n const grandchildTemplateContext = grandchildClonedContext.clone([grandchildNode], 0);\r\n grandchildTemplateContext.inApplyTemplates = true;\r\n await this.xsltChildNodes(grandchildTemplateContext, grandchildSelection.selectedTemplate, output);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected xsltValueOf(context: ExprContext, template: XNode, output?: XNode) {\r\n const select = xmlGetAttribute(template, 'select');\r\n const current = context.nodeList[context.position];\r\n\r\n // First try evaluating in the current context. If that returns an\r\n // empty result and the current node is the document node, try again\r\n // evaluating against the document element (fallback), which helps\r\n // with some templates written to expect either form.\r\n let attribute = this.xPath.xPathEval(select, context);\r\n if (\r\n current &&\r\n current.nodeName === '#document' &&\r\n (attribute.stringValue() === '' || (attribute instanceof NodeSetValue && attribute.nodeSetValue().length === 0))\r\n ) {\r\n const docChild = current.childNodes.find((c: XNode) => c.nodeName !== '#dtd-section');\r\n if (docChild) {\r\n const fallbackContext = context.clone([docChild], 0);\r\n attribute = this.xPath.xPathEval(select, fallbackContext);\r\n }\r\n }\r\n\r\n const value = attribute.stringValue();\r\n const node = domCreateTextNode(this.outputDocument, value);\r\n // Set siblingPosition to preserve insertion order during serialization\r\n const targetOutput = output || this.outputDocument;\r\n node.siblingPosition = targetOutput.childNodes.length;\r\n targetOutput.appendChild(node);\r\n }\r\n\r\n /**\r\n * Evaluates a variable or parameter and set it in the current input\r\n * context. Implements `xsl:variable`, `xsl:param`, and `xsl:with-param`.\r\n *\r\n * @param context The expression context.\r\n * @param template The template node.\r\n * @param override flag that defines if the value computed here\r\n * overrides the one already in the input context if that is the\r\n * case. I.e. decides if this is a default value or a local\r\n * value. `xsl:variable` and `xsl:with-param` override; `xsl:param` doesn't.\r\n */\r\n protected async xsltVariable(context: ExprContext, template: XNode, override: boolean) {\r\n const name = xmlGetAttribute(template, 'name');\r\n const select = xmlGetAttribute(template, 'select');\r\n\r\n let value: NodeValue;\r\n\r\n const nonAttributeChildren = template.childNodes.filter((n) => n.nodeType !== DOM_ATTRIBUTE_NODE);\r\n if (nonAttributeChildren.length > 0) {\r\n const fragment = domCreateDocumentFragment(template.ownerDocument);\r\n await this.xsltChildNodes(context, template, fragment);\r\n value = new NodeSetValue([fragment]);\r\n } else if (select) {\r\n value = this.xPath.xPathEval(select, context);\r\n } else {\r\n let parameterValue = '';\r\n const filteredParameter = this.options.parameters.filter((p) => p.name === name);\r\n if (filteredParameter.length > 0) {\r\n parameterValue = filteredParameter[0].value;\r\n }\r\n value = new StringValue(parameterValue);\r\n }\r\n\r\n if (override || !context.getVariable(name)) {\r\n context.setVariable(name, value);\r\n }\r\n }\r\n\r\n /**\r\n * Traverses the template node tree. Calls the main processing\r\n * function with the current input context for every child node of the\r\n * current template node.\r\n * @param context Normally the Expression Context.\r\n * @param template The XSL-T definition.\r\n * @param output If set, the output where the transformation should occur.\r\n */\r\n protected async xsltChildNodes(context: ExprContext, template: XNode, output?: XNode) {\r\n // Clone input context to keep variables declared here local to the\r\n // siblings of the children.\r\n const contextClone = context.clone();\r\n for (let i = 0; i < template.childNodes.length; ++i) {\r\n await this.xsltProcessContext(contextClone, template.childNodes[i], output);\r\n }\r\n }\r\n\r\n /**\r\n * This logic is used in two different places:\r\n * - `xsltPassThrough`, if the template asks this library to write a text node;\r\n * - `xsltProcessContext`, `apply-templates` operation, when the current node is text.\r\n * \r\n * Text nodes always require a parent, and they never have children.\r\n * @param context The Expression Context.\r\n * @param template The template, that contains the node value to be written.\r\n * @param output The output.\r\n */\r\n private commonLogicTextNode(context: ExprContext, template: XNode, output: XNode) {\r\n if (output) {\r\n // Check if this whitespace-only text node should be stripped based on\r\n // xsl:strip-space and xsl:preserve-space declarations\r\n if (this.shouldStripWhitespaceNode(template)) {\r\n return;\r\n }\r\n\r\n let node = domCreateTextNode(this.outputDocument, template.nodeValue);\r\n // Set siblingPosition to preserve insertion order during serialization\r\n node.siblingPosition = output.childNodes.length;\r\n domAppendChild(output, node);\r\n }\r\n }\r\n\r\n /**\r\n * Passes template text to the output. The current template node does\r\n * not specify an XSL-T operation and therefore is appended to the\r\n * output with all its attributes. Then continues traversing the\r\n * template node tree.\r\n * @param context The Expression Context.\r\n * @param template The XSLT stylesheet or transformation.\r\n * @param output The output.\r\n */\r\n protected async xsltPassThrough(context: ExprContext, template: XNode, output: XNode) {\r\n switch (template.nodeType) {\r\n case DOM_TEXT_NODE:\r\n if (this.xsltPassText(template)) {\r\n this.commonLogicTextNode(context, template, output);\r\n }\r\n\r\n break;\r\n case DOM_ELEMENT_NODE:\r\n let node: XNode;\r\n let elementContext = context;\r\n // Don't change context based on input document structure\r\n // The context should remain as provided, unless explicitly changed by XSLT instructions\r\n node = context.nodeList[context.position];\r\n\r\n let newNode: XNode;\r\n newNode = domCreateElement(this.outputDocument, template.nodeName);\r\n newNode.siblingPosition = node.siblingPosition;\r\n\r\n domAppendChild(output || this.outputDocument, newNode);\r\n await this.xsltChildNodes(elementContext, template, newNode);\r\n\r\n const templateAttributes = template.childNodes.filter((a: XNode) => a?.nodeType === DOM_ATTRIBUTE_NODE);\r\n for (const attribute of templateAttributes) {\r\n const name = attribute.nodeName;\r\n const value = this.xsltAttributeValue(attribute.nodeValue, elementContext);\r\n domSetAttribute(newNode, name, value);\r\n }\r\n\r\n break;\r\n default:\r\n // This applies also to the DOCUMENT_NODE of the XSL stylesheet,\r\n // so we don't have to treat it specially.\r\n await this.xsltChildNodes(context, template, output);\r\n }\r\n }\r\n\r\n /**\r\n * Determines if a text node in the XSLT template document is to be\r\n * stripped according to XSLT whitespace stripping rules.\r\n * @see [XSLT], section 3.4.\r\n * @param template The XSLT template.\r\n * @returns TODO\r\n * @todo Whitespace stripping on the input document is\r\n * currently not implemented.\r\n */\r\n protected xsltPassText(template: XNode) {\r\n if (!template.nodeValue.match(/^\\s*$/)) {\r\n return true;\r\n }\r\n\r\n let element = template.parentNode;\r\n if (this.isXsltElement(element, 'text')) {\r\n return true;\r\n }\r\n\r\n while (element && element.nodeType == DOM_ELEMENT_NODE) {\r\n const xmlspace = domGetAttributeValue(element, 'xml:space');\r\n if (xmlspace) {\r\n if (xmlspace == 'default') {\r\n return false;\r\n }\r\n\r\n if (xmlspace == 'preserve') {\r\n return true;\r\n }\r\n }\r\n\r\n element = element.parentNode;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n protected findAttributeInContext(attributeName: string, context: ExprContext): XNode {\r\n return context.nodeList[context.position].childNodes.find(\r\n (a: XNode) => a.nodeType === DOM_ATTRIBUTE_NODE && a.nodeName === attributeName\r\n );\r\n }\r\n\r\n /**\r\n * Evaluates an XSL-T attribute value template. Attribute value\r\n * templates are attributes on XSL-T elements that contain XPath\r\n * expressions in braces {}. The XSL-T expressions are evaluated in\r\n * the current input context.\r\n * @param value TODO\r\n * @param context TODO\r\n * @returns TODO\r\n */\r\n protected xsltAttributeValue(value: any, context: ExprContext) {\r\n const parts = value.split('{');\r\n if (parts.length === 1) {\r\n return value;\r\n }\r\n\r\n let ret = '';\r\n for (let i = 0; i < parts.length; ++i) {\r\n const rp = parts[i].split('}');\r\n if (rp.length != 2) {\r\n // first literal part of the value\r\n ret += parts[i];\r\n continue;\r\n }\r\n\r\n const val = this.xPath.xPathEval(rp[0], context).stringValue();\r\n ret += val + rp[1];\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Evaluates an XPath expression in the current input context as a\r\n * match.\r\n * @see [XSLT] section 5.2, paragraph 1\r\n * @param match TODO\r\n * @param context The Expression Context.\r\n * @param axis The XPath axis. Used when the match does not start with the parent.\r\n * @returns {XNode[]} A list of the found nodes.\r\n */\r\n protected xsltMatch(match: string, context: ExprContext, axis?: string): XNode[] {\r\n const expression = this.xPath.xPathParse(match, axis);\r\n return this.matchResolver.expressionMatch(expression, context);\r\n }\r\n\r\n /**\r\n * Sets parameters defined by xsl:with-param child nodes of the\r\n * current template node, in the current input context. This happens\r\n * before the operation specified by the current template node is\r\n * executed.\r\n * @param context The Expression Context.\r\n * @param template The template node.\r\n */\r\n protected async xsltWithParam(context: ExprContext, template: XNode) {\r\n for (const childNode of template.childNodes) {\r\n if (childNode.nodeType === DOM_ELEMENT_NODE && this.isXsltElement(childNode, 'with-param')) {\r\n await this.xsltVariable(context, childNode, true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Test if the given element is an XSLT element, optionally the one with the given name.\r\n * @param {XNode} element The element.\r\n * @param {string} opt_wantedName The name for comparison.\r\n * @returns True, if element is an XSL node. False otherwise.\r\n */\r\n protected isXsltElement(element: XNode, opt_wantedName?: string) {\r\n if (opt_wantedName && element.localName != opt_wantedName) return false;\r\n if (element.namespaceUri) return element.namespaceUri === 'http://www.w3.org/1999/XSL/Transform';\r\n return element.prefix === 'xsl'; // backwards compatibility with earlier versions of xslt-processor\r\n }\r\n}\r\n"],"mappings":"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","names":["he","he","i","node"]}