You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:09:17