Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XPath求值的Saxon表示_Java_Xslt_Saxon - Fatal编程技术网

Java XPath求值的Saxon表示

Java XPath求值的Saxon表示,java,xslt,saxon,Java,Xslt,Saxon,在ApacheXalan和.NETXSLT处理器中,XPath计算可以分别由DTMNodeIterator和XPathNodeIterator表示。撒克逊人是否有类似的设计?撒克逊人的设计不同,但有许多相似之处 在Saxon中,在大多数用户不需要关心的系统编程级别上,Expression对象有一个方法Expression.iterate(context),它返回一个SequenceIterator。因为这是XPath 2.0/3.1而不是1.0,所以SequenceIterator可以返回任何项

在ApacheXalan和.NETXSLT处理器中,XPath计算可以分别由DTMNodeIterator和XPathNodeIterator表示。撒克逊人是否有类似的设计?

撒克逊人的设计不同,但有许多相似之处

在Saxon中,在大多数用户不需要关心的系统编程级别上,
Expression
对象有一个方法
Expression.iterate(context)
,它返回一个
SequenceIterator
。因为这是XPath 2.0/3.1而不是1.0,所以
SequenceIterator
可以返回任何项(节点、原子值或函数),而不仅仅是节点。有许多内部实现的
SequenceIterator
;其中最重要的是
axisterator
,它通常用于XDM树的导航,通常使用XPath轴

在s9api级别(设计为典型用户应用程序的API),可执行XPath表达式由
XPathSelector
对象表示。这是一个
Iterable
,因此您可以使用
for(Item:selector)
语法,而不是显式使用迭代器;如果确实使用了
迭代器
方法,那么它实际上会返回一个
XdmSequenceIterator
,但出于所有实际目的,您可以将其用作
java.util.iterator
,其中
XdmItem
是节点、原子值或函数

Saxon 9.9还引入了一个与Linq类似的基于流的API。这允许您使用Java功能接口导航树:您现在可以编写如下内容:

for (XdmNode pack : testInput.select(
            child("package").where(attributeEq("role", "secondary"))).asListOfNodes() {
           ...
}

它完全隐藏了底层迭代器。这相当于迭代XPath表达式的结果
包[@role='secondary']
,但它节省了编译表达式的成本,这通常比执行成本大得多。

好吧,在s9api级别上,我可以说
XdmSequenceIterator
,尽可能地说,基于XSLT 1的Xalan或XQuery 1(但XPath 1限制的.NET API)与Saxon 9.0的XPath 2和3以及3.1 XDM表示之间的等效性。目前我们只是尝试从Xalan迁移,所以XSLT1.0就足够了(目前)。在使用扩展函数(Java)时,XpathSelector是如何产生的?如果扩展函数正在进行这种导航,那么通常使用XSLT 2.0时,最好使其成为用XSLT编写的样式表函数,而不是用Java编写的扩展函数。但是有大量关于Saxon扩展函数的文档,如果你不能理解它,你需要问一个更具体的问题,关于你不理解的部分。1)我们使用扩展函数的原因是因为我们进行几何计算,目前依赖于JTS库,因此,我认为XSLT函数是不够的。2) 此外,我们正在进行迁移。因此,最好先从Xalan迁移到Saxon,然后再进行优化。您知道如何按照我的要求使用XpathSelector吗?不幸的是,有很多方法可以做到这一点,而哪种方法最适合您取决于许多因素:您使用的是哪种Saxon版本,您使用的是哪种API,等等。在saxonica.plan.io上的Saxon帮助论坛上,这可能是一个最好的问题,该论坛(与saxonica.plan.io不同)允许进行更广泛的讨论。我会看看那里,但如果有很多方法,您能提供一种方法吗?现在我们得到一个TinyElementImpl。