Node.js中使用SaxonJS对HTMLElement执行XPath报错的解决咨询
在Node.js中用SaxonJS对HTML DOM执行XPath 3.0的解决方案
问题重现
创建HTML元素的代码:
const node = document.createElement('div'); node.innerHTML = "<p>Text 1</p>"
尝试直接用SaxonJS执行XPath时出现以下错误:
- 执行
const res = saxonJs.XPath.evaluate('//p', node);,报错:Context item for '/' must be a node - 执行
const res = saxonJs.XPath.evaluate('*', node);,报错:Context item for child axis is not a node - supplied:HashTrie map{}
问题原因
SaxonJS无法直接处理浏览器/jsdom生成的原生HTMLElement节点,必须先将其转换为SaxonJS兼容的XDM(XQuery Data Model)节点格式。
解决方法
方法1:转换原生DOM节点为XDM节点
在Node.js环境中,先使用jsdom解析HTML为DOM,再通过SaxonJS的XDM.fromNode()方法完成转换:
const { JSDOM } = require('jsdom'); const saxonJs = require('saxon-js'); // 解析HTML字符串生成DOM const dom = new JSDOM('<div><p>Text 1</p></div>'); const targetNode = dom.window.document.querySelector('div'); // 转换为XDM节点 const xdmNode = saxonJs.XDM.fromNode(targetNode); // 执行XPath 3.0查询 const result = saxonJs.XPath.evaluate('//p', xdmNode); console.log(result);
方法2:直接解析HTML字符串为XDM文档
若无需先构建原生DOM,可直接通过SaxonJS的getResource()方法将HTML字符串解析为XDM节点集:
const saxonJs = require('saxon-js'); const htmlContent = '<div><p>Text 1</p></div>'; // 解析HTML为XDM文档 const xdmDocument = saxonJs.getResource({ text: htmlContent, contentType: 'text/html' }); // 执行XPath查询 const result = saxonJs.XPath.evaluate('//p', xdmDocument); console.log(result);
替代方案
如果SaxonJS的配置成本过高,可选择以下工具:
- xpath:轻量模块,支持XPath 1.0,搭配
jsdom即可使用 - fontoxpath:支持XPath 3.1,可直接处理DOM节点或HTML字符串,无需额外转换
参考文档(翻译)
- XPath 评估:SaxonJS提供的核心API,用于执行XPath查询,可指定上下文节点、命名空间绑定、返回类型等参数
- SaxonJS 类型转换:定义了JavaScript原生类型与SaxonJS的XDM数据模型之间的转换规则,涵盖节点、基本数据类型(字符串、数字等)的双向转换
内容的提问来源于stack exchange,提问作者Shukai Ni
相关产品推荐
相关产品推荐

