我是带有 Xpath2 的 XSLT3 的 Saxon 9.5EE 实现,并正在寻找最快的方法来识别排序序列 $seq 中小于某个给定值 $value 的最大元素。
据我所知,没有什么相当于序列的“preceding::sibling”。这意味着 Xpath 在遍历序列时不如遍历 XML 树时灵活。
也就是说,你不能说$seq[。gt $value][1]/preceding-sibling:item[1] 因为“/”只为节点定义,“preceding-sibling”不会引用序列,而是引用相关节点的 XML 树。
反正...
我找到了两种方法来做到这一点,但它们似乎不必要地复杂。
一种方法是:
$seq[($seq!(if(. gt $value) then position() else ()))[1] - 1]
另一种方法是
<xsl:iterate select="$seq">
<xsl:variable name="pos" select="position()"/>
<xsl:if test=". gt $trial">
<xsl:text>
</xsl:text>
<xsl:sequence select="$seq[$pos - 1]"/>
<xsl:break/>
</xsl:if>
</xsl:iterate>
有没有更好的办法?
顺便说一句,测试这两个选项得到了有趣的结果。如果我只是在寻找相关项目的位置,那么它们最终在性能上几乎相同。
但是,如果我真的对值本身感兴趣,则该选项会压碎另一个……大概是因为由于迭代命令,该序列已经在内存中准备好了。