撒克逊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
列表,这不是情况。
任何想法?
看起来像一个bug。我在这里记录了它的动作:
https://saxonica.plan.io/issues/3006从检查代码来看,在XdmValue是单例xdmem的情况下,我认为GetList()是错误的。因此,在我们产生修复之前,您可以通过测试XdmValue来解决问题。