撒克逊XQueryEvaluator.Evaluate返回TinyElementImpl而不是XdmNode

本文关键字:XdmNode TinyElementImpl XQueryEvaluator Evaluate 返回 撒克逊 | 更新日期: 2023-09-27 18:14:10

这是我的代码的简化版本

Processor processor = new Processor();
DocumentBuilder documentBuilder = processor.NewDocumentBuilder();
documentBuilder.IsLineNumbering = true;
documentBuilder.WhitespacePolicy = WhitespacePolicy.PreserveAll;
XQueryCompiler compiler = processor.NewXQueryCompiler();
string query = BuildXqueryString();
if (!String.IsNullOrEmpty(query))
{
    XQueryExecutable executable = compiler.Compile(query);
    XQueryEvaluator evaluator = executable.Load();
    evaluator.ContextItem = documentBuilder.Build(xmlNode);
    var evaluations = evaluator.Evaluate();
    foreach (var evaluation in evaluations)
       runEvaluation((XdmNode)evaluation, document);
}

这是我现在所拥有的,它按预期工作。现在我们正在做一些更改来并行化评估,并且我在修改最后一个foreach以将其更改为Parallel.ForEach时遇到了问题。这是我替换foreach:

的新代码
List<XdmNode> evaluationsAsList = evaluations.GetList().Cast<XdmNode().ToList();
Parallel.ForEach(evaluationsAsList, evaluation =>
   runEvaluation(evaluation, document)
);

这段代码失败了,因为GetList()返回给我的是net.sf.saxon.tree.tiny.TinyElementImpl而不是Saxon.Api.XdmNode的列表。根据文档GetList()应该总是返回至少一个Saxon.Api.XdmItem列表,这不是情况。

任何想法?

撒克逊XQueryEvaluator.Evaluate返回TinyElementImpl而不是XdmNode

看起来像一个bug。我在这里记录了它的动作:

https://saxonica.plan.io/issues/3006

从检查代码来看,在XdmValue是单例xdmem的情况下,我认为GetList()是错误的。因此,在我们产生修复之前,您可以通过测试XdmValue来解决问题。