- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须使用 saxon HE 在 xquery 中调用外部 java 方法。我可以使用下面的代码调用这些方法。但问题是我想在外部绑定(bind)我的输入。
final Configuration config = new Configuration();
config.registerExtensionFunction(new ShiftLeft());
final StaticQueryContext sqc = new StaticQueryContext(config);
final XQueryExpression exp = sqc.compileQuery(new FileReader(
"input/names.xq"));
final DynamicQueryContext dynamicContext = new DynamicQueryContext(config);
String xml = "<student_list><student><name>George Washington</name><major>Politics</major><phone>312-123-4567</phone><email>gw@example.edu</email></student><student><name>Janet Jones</name><major>Undeclared</major><phone>311-122-2233</phone><email>janetj@example.edu</email></student><student><name>Joe Taylor</name><major>Engineering</major><phone>211-111-2333</phone><email>joe@example.edu</email></student></student_list>";
DocumentBuilderFactory newInstance = DocumentBuilderFactory.newInstance();
newInstance.setNamespaceAware(true);
Document parse = newInstance.newDocumentBuilder().parse(new InputSource(new StringReader(xml)));
DocumentWrapper sequence = new DocumentWrapper(parse, "", config);
StructuredQName qname = new StructuredQName("", "", "student_list");
dynamicContext.setParameter(qname, sequence);
Properties props = new Properties();
final SequenceIterator iter = exp.iterator(dynamicContext);
props.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
props.setProperty(OutputKeys.INDENT, "yes");
StringWriter writer = new StringWriter();
QueryResult.serializeSequence(iter, config, writer, props);
System.out.println("Result is " + writer);
名称.xq
declare namespace eg="http://example.com/saxon-extension";
declare namespace xs = "http://www.w3.org/2001/XMLSchema";
declare variable $student_list as element(*) external;
<Students>
<value> {
let $n := eg:shift-left(2, 2)
return $n
}</value>
<student_names>
{ $student_list//student_list/student/name }
</student_names>
</Students>
但出现以下错误
Error at procedure student_list on line 3 of students.xml:
XPTY0004: Required item type of value of variable $student_list is element(); supplied
value has item type document-node(element(Q{}student_list))
net.sf.saxon.trans.XPathException: Required item type of value of variable $student_list is element(); supplied value has item type document- node(element(Q{}student_list))
at net.sf.saxon.expr.ItemTypeCheckingFunction.testConformance(ItemTypeCheckingFunction.java:69)
at net.sf.saxon.expr.ItemTypeCheckingFunction.mapItem(ItemTypeCheckingFunction.java:50)
at net.sf.saxon.expr.ItemMappingIterator.next(ItemMappingIterator.java:95)
at net.sf.saxon.expr.CardinalityCheckingIterator.<init>(CardinalityCheckingIterator.java:52)
at net.sf.saxon.type.TypeHierarchy.applyFunctionConversionRules(TypeHierarchy.java:230)
at net.sf.saxon.expr.instruct.GlobalParameterSet.convertParameterValue(GlobalParameterSet.java:105)
at net.sf.saxon.expr.instruct.Bindery.useGlobalParameter(Bindery.java:136)
at net.sf.saxon.expr.instruct.GlobalParam.evaluateVariable(GlobalParam.java:62)
at net.sf.saxon.expr.GlobalVariableReference.evaluateVariable(GlobalVariableReference.java:105)
at net.sf.saxon.expr.VariableReference.evaluateItem(VariableReference.java:460)
at net.sf.saxon.expr.Atomizer.evaluateItem(Atomizer.java:313)
at net.sf.saxon.expr.Atomizer.evaluateItem(Atomizer.java:35)
at net.sf.saxon.expr.AtomicSequenceConverter.evaluateItem(AtomicSequenceConverter.java:275)
at net.sf.saxon.expr.AtomicSequenceConverter.evaluateItem(AtomicSequenceConverter.java:30)
at net.sf.saxon.functions.Doc.doc(Doc.java:235)
at net.sf.saxon.functions.Doc.evaluateItem(Doc.java:190)
at net.sf.saxon.functions.Doc.evaluateItem(Doc.java:28)
at net.sf.saxon.expr.SimpleStepExpression.iterate(SimpleStepExpression.java:85)
at net.sf.saxon.expr.SlashExpression.iterate(SlashExpression.java:842)
at net.sf.saxon.expr.sort.DocumentSorter.iterate(DocumentSorter.java:168)
at net.sf.saxon.expr.SlashExpression.iterate(SlashExpression.java:842)
at net.sf.saxon.expr.sort.DocumentSorter.iterate(DocumentSorter.java:168)
at net.sf.saxon.expr.Expression.process(Expression.java:552)
at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:450)
at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:389)
at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:669)
at net.sf.saxon.expr.instruct.Instruction.process(Instruction.java:144)
at net.sf.saxon.expr.instruct.ElementCreator.constructElement(ElementCreator.java:539)
at net.sf.saxon.expr.instruct.ElementCreator.evaluateItem(ElementCreator.java:476)
at net.sf.saxon.expr.instruct.Instruction.iterate(Instruction.java:363)
at net.sf.saxon.query.XQueryExpression.iterator(XQueryExpression.java:332)
at com.example.saxon.ExternalMethodCaller.main(ExternalMethodCaller.java:77)
提前致谢..
最佳答案
除非您有充分的理由不这样做,否则我的建议是使用 Snappi(Saxon 9 API,或 s9api):
Processor saxon = new Processor(false);
saxon.registerExtensionFunction(new MyExtension());
XQueryCompiler compiler = saxon.newXQueryCompiler();
XQueryExecutable exec = compiler.compile(new File("input/names.xq"));
XQueryEvaluator query = exec.load();
DocumentBuilder builder = saxon.newDocumentBuilder();
String students = "<xml>...</xml>";
Source src = new StreamSource(new StringReader(students));
XdmNode doc = builder.build(src);
query.setExternalVariable(new QName("student_list"), doc);
XdmValue result = query.evaluate();
MyExtension
看起来如下所示:
public class MyExtension
implements ExtensionFunction
{
@Override
public QName getName()
{
return new QName("http://example.org/my-project", "my-fun");
}
@Override
public SequenceType getResultType()
{
return SequenceType.makeSequenceType(
ItemType.INTEGER, OccurrenceIndicator.ONE);
}
@Override
public SequenceType[] getArgumentTypes()
{
return new SequenceType[] {
SequenceType.makeSequenceType(
ItemType.INTEGER, OccurrenceIndicator.ONE),
SequenceType.makeSequenceType(
ItemType.INTEGER, OccurrenceIndicator.ONE)
};
}
@Override
public XdmValue call(XdmValue[] args) throws SaxonApiException
{
long first = ((XdmAtomicValue)args[0].itemAt(0)).getLongValue();
long second = ((XdmAtomicValue)args[0].itemAt(0)).getLongValue();
long result = ...;
return new XdmAtomicValue(result);
}
}
请参阅 http://www.saxonica.com/documentation9.5/extensibility/integratedfunctions/ext-simple-J.html 处的文档了解详情。
EXPath 还有一个名为 tools-saxon
的项目,其中包含几个在 Java 中使用 Saxon 的工具。包括扩展功能。它引入了函数库的概念,如果您有多个扩展函数,这会很方便。它还引入了一个函数定义构建器,允许人们用尽可能少的样板代码构建函数定义(并为类型序列提供方便的快捷方式)。在上面的代码中,将注册函数(前两行)替换为:
Processor saxon = new Processor(false);
Library lib = new MyLibrary();
lib.register(saxon.getUnderlyingConfiguration());
并将扩展类替换为以下 2 个类(分别是一个库和一个函数):
public class MyLibrary
extends Library
{
public MyLibrary()
{
super("http://example.org/my-project", "my");
}
@Override
protected Function[] functions()
{
return new Function[] {
new MyFunction(this)
};
}
}
public class MyFunction
extends Function
{
public MyFunction(Library lib)
{
super(lib);
}
@Override
protected Definition makeDefinition()
{
return library()
.function(this, "my-fun")
.returns(Types.SINGLE_INTEGER)
.param(Types.SINGLE_INTEGER, "first")
.param(Types.SINGLE_INTEGER, "second")
.make();
}
@Override
public Sequence call(XPathContext ctxt, Sequence[] args)
throws XPathException
{
Parameters params = checkParams(args);
long first = params.asLong(0, true);
long second = params.asLong(1, true);
long result = 0;
return Return.value(result);
}
}
查看 Github 上项目主页的所有信息,地址:https://github.com/expath/tools-saxon .
注意:未经测试。
关于java - 如何使用 saxon 将外部输入绑定(bind)到 xquery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30255908/
我有一个现有的 CentOS 7 服务器(当然是由其他人设置的)运行 Saxon。如果我运行: /usr/bin/java net.sf.saxon.Transform -s:input.xml -x
我目前正在使用各种版本的 Saxon-Processor 进行纯 XSL 转换。下面是我的简短样式表,根据我的问题的需要进行了简化: Call of func_
我正在尝试从 java 代码中抛出异常,该异常将在使用 Saxon 时包含来自 xsl:message 标记的消息。 使用下面的 xslt 文件 exception me
Saxon似乎不是gradle试图发送它的地方: Not Found For request 'GET /artifact/net/sf/saxon/saxon-HE/9.9.0-2/saxon-HE
我最近获得了 Saxon-PE 的试用许可证,并希望在 Camel 中使用此版本的 Saxon。我下载了 Saxon-PE-9.6.0.8 jar 并通过 maven 将它们包含到我的项目中。我正在使
我正在使用 Saxon 9.0.4 并将 Home Edition jar 包含在我的 Eclipse 项目中。但是每当我发出查询字符串时,什么也没有发生,并且我没有得到任何输出。当我从命令行使用以下
我想使用 xpath 3.1 fn:transform 创建一个输出文档。以下是 A.xsl。它在直接运行时创建 A.xml(从氧气中):
我对此很陌生。 我有一个查询和一个 xml 文件。 我可以写一个对该特定文件的查询 for $x in doc("file:///C:/Users/Foo/IdeaProjects/XQuery/sr
简单的问题! 如何找出我正在运行的 Saxon 版本?我有“sazon9he.jar”文件,但我似乎无法弄清楚确切的版本(即它是 9.7 还是 9.6...) 谢谢! 最佳答案 在发布问题几分钟后终于
Saxon 是否有办法按排序顺序返回节点,其中“顺序”由返回节点中的 1 个或多个节点/属性定义? 换句话说,XPath 查询可以是: /Order/Dates/Date order by . 谢谢
我发现 saxon 9.9.1-4 中 XQueryCompiler 的行为非常奇怪。当我第一次运行 XQuery 时,无论 XQuery 复杂性如何,编译都会花费大量时间(400 毫秒)——例如 m
我正在使用 Saxon 解析器将大文件拆分为较小的文件。下面是我的示例代码, TransformerFactory tFactory = TransformerFactory.newInstanc
我们通常会进行大量的 XPath 查询,但几乎没有一个重复。因此每个查询都会被编译、执行,然后被抛出。 在 Saxon 中是否有一种模式,我们应该设置告诉它构建一次性使用的编译查询,这样在这种模式下使
我们将撒克逊语与我们的图书馆一起运送。我们以代码形式向其传递许可证,因此不发送 saxon-library.lic 文件。我们的系统一切都运行良好。 但是,我们的一位客户遇到了一个问题,当 hazel
我最初应该通过声明我们的代码使用嵌入式 saxon 扩展函数来发布我的问题 - saxon:parse($xml) 返回 xml 的根元素/节点。但是,在 Saxon-HE 中,该扩展不再可用 - 所
给定以下xml: Wells 使用 Xerces,以下 xpath 查询有效: //urn:company.com:catalog.01:author 当我使用
有谁知道用于在 XSLT 中执行合并的内置函数,还是我需要编写自己的函数? 我有一些像这样的 xml: Worldwide WorldwideName 78 GB
如何将多个字段传递到 Saxon-HE ExtensionFunction 中? 扩展通常需要一个参数数组: new ExtensionFunction { @Override pub
我想知道是否有人有使用 XQuery 的经验,因为 free version of Saxon 支持它。 。一般可以认为它是完整且可用的吗? 最佳答案 是的,我发现免费版本快速且稳定。 XQuery
我有一个将 Json 转换为 Json 的 XQuery。我制作了一个可以在命令行上运行的演示版本,我想在 java 中使用它。 问题是我不知道如何在 XQuery 中设置参数。 我的源文件“1.js
我是一名优秀的程序员,十分优秀!