如何用SaxonJS 2.5实现XQuery 3.1的JavaScript求值函数?
使用SaxonJS 2.5实现XQuery 3.1求值函数
问题背景
需求:创建一个JavaScript函数,接收XML文档字符串与XQuery 3.1表达式字符串,返回XQuery求值结果字符串。
已完成工作:使用浏览器版SaxonJS 2.5实现了XPath表达式求值函数,也可完成XSLT转换,但未找到文档中关于XQuery查询求值的相关内容,希望获得类似XPath求值的XQuery实现方案。
实现方案
SaxonJS 2.5原生支持XQuery 3.1执行,以下是与XPath求值逻辑对齐的实现方案:
完整函数代码
function evaluateXQuery(xmlStr, xqueryStr) { // 解析XML字符串为SaxonJS兼容节点 const xmlDoc = SaxonJS.getPlatform().parseXmlFromString(xmlStr); // 编译并执行XQuery,传入XML文档作为上下文项 const result = SaxonJS.XQuery.evaluate(xqueryStr, { contextItem: xmlDoc }); // 处理并序列化结果 if (Array.isArray(result)) { // 处理序列结果:节点序列化,原子值直接转字符串 return result.map(item => item.nodeType ? SaxonJS.serialize(item) : String(item) ).join('\n'); } else if (result.nodeType) { // 处理单个节点结果 return SaxonJS.serialize(result); } else { // 处理单个原子值结果 return String(result); } }
关键细节解释
- XML解析:使用
SaxonJS.getPlatform().parseXmlFromString()解析XML字符串,确保生成的节点能被SaxonJS的XQuery引擎正确识别。 - XQuery执行:
SaxonJS.XQuery.evaluate()是核心方法,支持直接传入XQuery字符串,通过context参数指定执行的上下文节点(即输入的XML文档)。如果需要重复执行同一表达式,可先用SaxonJS.XQuery.compile()预编译表达式提升性能。 - 结果序列化:根据XQuery返回值的类型(序列、单个节点、原子值)做差异化处理,使用
SaxonJS.serialize()将XML节点转换为字符串,原子值直接转为字符串输出。
使用示例
// 示例XML输入 const sampleXml = `<library> <book id="1"> <title>XQuery 3.1: An Introduction</title> <price>49.99</price> </book> <book id="2"> <title>Learning SaxonJS</title> <price>39.99</price> </book> </library>`; // 示例XQuery表达式 const sampleXQuery = ` for $book in /library/book where $book/price < 45 return $book/title/text() `; // 执行求值 const evaluationResult = evaluateXQuery(sampleXml, sampleXQuery); console.log(evaluationResult); // 输出:Learning SaxonJS
内容的提问来源于stack exchange,提问作者cespon
相关产品推荐
相关产品推荐

