如何从xpath表达式获取实际的Node顺序(java)

fon*_*net 4 java xslt xpath

如果我有一个使用的XPath表达式preceding-sibling::,我得到的NodeList顺序不正确.我怎样才能得到正确的订单?例:

<library>
  <book name="book1">
    hello
  </book>
  <book name="book2">
    world
  </book>
  <book name="book3">
    !!!
  </book>
</library>
Run Code Online (Sandbox Code Playgroud)

如果我尝试评估XPath表达式:/library/book[3]/preceding-sibling::book,我得到这个顺序:

  • BOOK1
  • 第二册

但如果我试图评估:/library/book[3]/preceding-sibling::book[1],我得到Node:

  • 第二册

那么,我怎样才能从这种表达式中获得真正的顺序:

/library/book[3]/preceding-sibling::book

小智 5

来自http://www.w3.org/TR/xpath/#predicates

轴是前轴或倒轴.仅包含上下文节点或文档顺序中的上下文节点之后的节点的轴是前向轴.仅包含文档顺序中上下文节点之前的上下文节点的轴是反向轴.因此,祖先,祖先或自我,先前和前兄弟轴是反向轴; 所有其他轴都是前轴.由于自轴总是包含至多一个节点,因此它是正向轴还是反向轴没有区别.节点集的成员相对于轴的接近位置被定义为如果轴是前向轴并且按照相反的文档顺序排序的,则按文档顺序排序的节点集中的节点的位置.是一个反向轴.第一个位置是1.

关于使用特定XPath引擎评估某些XPath表达式后的结果节点集的顺序,这完全取决于实现.在XSLT中,当指令处理按文档顺序排序的节点集时,会明确定义它.在XPath中,这是在http://www.w3.org/TR/xpath/#section-Introduction中定义节点集的方式:

node-set(没有重复的无序节点集合)

这就是为什么在标准DOM API中有一些设置可以获得有序和无序的结果以及XQuery