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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:47:26