Saxon HE XQuery 文档中的进程节点抛出有关 BaseUri 的错误



我正在尝试使用C#和XQuery处理器的Saxon HE来处理输入XML文档,如下所示(输入文档req.XML,XQuery字符串req.XQuery(:

Processor processor = new Processor();
var documentBuilder = processor.NewDocumentBuilder();
documentBuilder.BaseUri = new Uri("file://");
var xdmNode = documentBuilder.Build(new StringReader(req.XML));
XQueryCompiler compiler = processor.NewXQueryCompiler();
compiler.BaseUri = "file:///C:/temp/";
compiler.DeclareNamespace("saxon", "http://saxon.sf.net/");
XQueryExecutable exp = compiler.Compile(req.XQuery);
XQueryEvaluator eval = exp.Load();
eval.ContextItem = xdmNode;
var results = new XdmDestination();
eval.Run(results);

XmlXQueryResponse output = new XmlXQueryResponse();
output.XMLResult = results.XdmNode.OuterXml;

这是我正在测试的 XQuery 查询:

for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title

这是我正在测试的XML文件:https://www.w3schools.com/xml/books.xml

但是,当我运行它时,我收到以下错误:

Saxon.Api.DynamicError: 'Exception by URIResolver'

此错误由行eval.Run(results)引发。

如果我删除该行compiler.BaseUri = "file:///C:/temp/";则会出现相同的错误。

我很难理解为什么它抱怨BaseUri,因为我是撒克逊HE的新手。

知道为什么会发生这种情况吗? 任何这方面的帮助将不胜感激。

如果要从服务器加载文件,请使用

for $x in doc("https://www.w3schools.com/xml/books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title

https://xqueryfiddle.liberty-development.net/eiZQaEM

对于查询,如果您使用 DocumentBuilder 自己解析 XML 并将其设置为上下文项,则只需使用for $x in /bookstore/book,则不需要doc函数调用。

如果文件确实存在于file:///C:/temp/books.xml,那么我希望您的代码成功。

如果该文件在该位置不存在,那么我预计会出现不同的错误:一个清楚地告诉您找不到该文件的FODC0005或FODC0002。

如果位置file:///C:/temp/不存在,那么我可以看到事情变得更加混乱;也许我们应该在这种情况下产生更好的诊断。

但是,您没有提供足够的信息让我们知道哪些情况适用。

最新更新