|
85 | 85 | } |
86 | 86 |
|
87 | 87 | function nameMany(target: string, root: Root): Element[] { |
88 | | - return Array.from(root.querySelectorAll('*')).filter(el => el.getAttribute('name') === target) |
| 88 | + return Array.from(root.querySelectorAll('[name="' + target.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"]')) |
89 | 89 | } |
90 | 90 |
|
91 | 91 | function tagNameMany(target: string, root: Root): Element[] { |
|
108 | 108 | return [] |
109 | 109 | } |
110 | 110 | try { |
111 | | - const reversedNs: Record<string, string> = {} |
112 | | - const allNodes = doc.getElementsByTagName('*') |
113 | | - for (let i = 0; i < allNodes.length; i++) { |
114 | | - const n = allNodes[i] |
115 | | - const ns = n.namespaceURI |
116 | | - if (ns && !reversedNs[ns]) { |
117 | | - let prefix = n.lookupPrefix(ns) |
118 | | - if (!prefix) { |
119 | | - const m = ns.match('.*/(\\w+)/?$') |
120 | | - prefix = m ? m[1] : 'xhtml' |
| 111 | + // Namespace prefixes require a colon in the XPath expression. Skip the |
| 112 | + // expensive full-DOM scan when the expression contains no colon at all. |
| 113 | + let resolver: ((prefix: string | null) => string | null) | null = null |
| 114 | + if (target.indexOf(':') !== -1) { |
| 115 | + const reversedNs: Record<string, string> = {} |
| 116 | + const allNodes = doc.getElementsByTagName('*') |
| 117 | + for (let i = 0; i < allNodes.length; i++) { |
| 118 | + const n = allNodes[i] |
| 119 | + const ns = n.namespaceURI |
| 120 | + if (ns && !reversedNs[ns]) { |
| 121 | + let prefix = n.lookupPrefix(ns) |
| 122 | + if (!prefix) { |
| 123 | + const m = ns.match('.*/(\\w+)/?$') |
| 124 | + prefix = m ? m[1] : 'xhtml' |
| 125 | + } |
| 126 | + reversedNs[ns] = prefix! |
121 | 127 | } |
122 | | - reversedNs[ns] = prefix! |
123 | 128 | } |
| 129 | + const namespaces: Record<string, string> = {} |
| 130 | + for (const key in reversedNs) { |
| 131 | + namespaces[reversedNs[key]] = key |
| 132 | + } |
| 133 | + resolver = (prefix: string | null): string | null => namespaces[prefix || ''] || null |
124 | 134 | } |
125 | | - const namespaces: Record<string, string> = {} |
126 | | - for (const key in reversedNs) { |
127 | | - namespaces[reversedNs[key]] = key |
128 | | - } |
129 | | - let resolver: XPathNSResolver | ((prefix: string | null) => string | null) = |
130 | | - (prefix: string | null): string | null => namespaces[prefix || ''] || null |
131 | 135 |
|
132 | 136 | let result: XPathResult | null = null |
133 | 137 | try { |
|
0 commit comments