Ao usar XPath para consultar / avaliar um documento XML gerado pelo DOMParser do JSDOM, a parte do atributo da consulta parece ser forçada a minúsculas, tornando impossível consultar os atributos que contêm caracteres maiúsculos.
Por exemplo, dado o seguinte documento:
<?xml version="1.0" encoding="utf-8"?><example Foo="bar"></example>
^-- capital F
Uma consulta para //*[@Foo="bar"]
(ou //*[@foo="bar"]
para esse assunto) não retorna nenhuma correspondência, no entanto, dado este documento em vez de atributos em minúsculas:
<?xml version="1.0" encoding="utf-8"?><example foo="bar"></example>
^-- lower case F
Agora, com este novo documento, //*[@foo="bar"]
( e o equivalente em maiúsculas //*[@Foo="bar"]
) encontrou a correspondência com sucesso.
Eu encontrei um problema semelhante há muito tempo (https://github.com/jsdom/jsdom/issues/651) que foi corrigido pela introdução do Saxes para analisar documentos XML separadamente de documentos HTML, no entanto, atualmente no nível de análise de tudo parece ser analisado corretamente (por exemplo, os atributos mantêm suas maiúsculas e minúsculas). É no nível de avaliação XPath que a consulta parece estar em letras minúsculas.
Tentei restringir onde o erro pode estar ocorrendo e cheguei a https://github.com/jsdom/jsdom/blob/b83783da63deeb7c5602b024a92e214df423a412/lib/jsdom/level3/xpath.js#L1659
Definir esse shouldLowerCase
como false
corrige meu caso de uso, mas não estou ciente das implicações que isso tem para o resto da implementação XPath.
const { JSDOM } = require("jsdom");
const dom = new JSDOM();
const domParser = new dom.window.DOMParser();
const doc = domParser.parseFromString('<?xml version="1.0" encoding="utf-8"?><example Foo="bar"></example>', 'text/xml');
const result = doc.evaluate('//*[@Foo="bar"]', doc, null, XPathResult.ANY_TYPE, null);
const exampleNode = result.iterateNext();
console.log('Result:', exampleNode); // exampleNode is null
https://jsbin.com/qegifaqumi/2/edit?js , console
A consulta XPath faz distinção entre maiúsculas e minúsculas e pode corresponder a nós com atributos com caracteres maiúsculos.
Há muito tempo que fazemos uma tarefa para substituir nossa antiga implementação xpath enrolada à mão por uma de terceiros mantida. Essa é provavelmente a melhor rota para consertar isso, embora um PR com um teste também seja aceitável.
Oi, alguma atualização?
Comentários muito úteis
https://mobile.twitter.com/slicknet/status/782274190451671040