Java XPath求值的Saxon表示
在ApacheXalan和.NETXSLT处理器中,XPath计算可以分别由DTMNodeIterator和XPathNodeIterator表示。撒克逊人是否有类似的设计?撒克逊人的设计不同,但有许多相似之处 在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可以返回任何项
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。