XPathを使用してJSDOMのDOMParserによって生成されたXMLドキュメントをクエリ/評価する場合、クエリの属性部分が小文字に強制されているように見えるため、大文字を含む属性をクエリできません。
たとえば、次のドキュメントがあるとします。
<?xml version="1.0" encoding="utf-8"?><example Foo="bar"></example>
^-- capital F
//*[@Foo="bar"]
(またはそのことについては//*[@foo="bar"]
)のクエリは一致を返しませんが、代わりに小文字の属性を持つこのドキュメントを指定します。
<?xml version="1.0" encoding="utf-8"?><example foo="bar"></example>
^-- lower case F
この新しいドキュメントを使用すると、 //*[@foo="bar"]
(および大文字に相当する//*[@Foo="bar"]
)が一致するものを正常に見つけることができます。
昔から同様の問題(https://github.com/jsdom/jsdom/issues/651)を見つけました。これは、Saxesを導入してHTMLドキュメントとは別にXMLドキュメントを解析することで修正されましたが、現在はすべての解析レベルで正しく解析されているようです(たとえば、属性は大文字と小文字を区別します)。 クエリが小文字であるように見えるのは、XPath評価レベルです。
エラーが発生している可能性のある場所を絞り込んでみましたが、 https://github.com/jsdom/jsdom/blob/b83783da63deeb7c5602b024a92e214df423a412/lib/jsdom/level3/xpath.js#L1659に到達しました
そのshouldLowerCase
値をfalse
すると、ユースケースが修正されますが、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
XPathクエリでは大文字と小文字が区別され、大文字の属性を持つノードと照合できます。
私たちは長い間、古い手巻きのxpath実装を、維持されているサードパーティの実装に置き換えるための作業を行ってきました。 これはおそらくこれを修正するための最良のルートですが、テストを使用したスポット修正PRも許容されます。
こんにちは、更新はありますか?
最も参考になるコメント
https://mobile.twitter.com/slicknet/status/782274190451671040