要在 Saxon 中对查询进行排序,我们首先运行查询:XPathExecutable exe = xPath.compile(query);XPathSelector selector = exe.load();selector.setContextItem(xmlDocument);XdmValue nodeSet = selector.evaluate();// put the results in an arrayArrayList<XdmItem> nodes = new ArrayList<XdmItem>();for (int i = 0; i < nodeSet.size(); i++) nodes.add(nodeSet.itemAt(i));// Sort the resultssortNodes(nodes, "RiskLevel", false, false); private void sortNodes(ArrayList<XdmItem> nodes, final String sortKey, final boolean sortIsAttr, boolean descending) { Comparator comparator = new Comparator() { public int compare(Object node1, Object node2) { if (node1 instanceof XdmNode && node2 instanceof XdmNode) { if (sortIsAttr) { return ((XdmNode) node1).getAttributeValue(new QName(sortKey)).compareTo(((XdmNode) node2).getAttributeValue(new QName(sortKey))); } else { XdmSequenceIterator iter1, iter2; if (sortKey.equals(".")) { iter1 = ((XdmNode) node1).axisIterator(Axis.SELF, new QName(((XdmNode) node1).getNodeName().getLocalName())); iter2 = ((XdmNode) node2).axisIterator(Axis.SELF, new QName(((XdmNode) node2).getNodeName().getLocalName()));在两个 hasNext() 调用上都返回 false。第一个问题,这是执行此操作的最佳方式吗?如果没有,有什么更好的方法?第二个问题,如果这是最好的方法,为什么迭代器返回 false ofr hasNext()?
1 回答
摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
为什么不使用 XQuery 进行排序?生成和编译查询
'declare variable $nodes external; for $n in $nodes order by $n/' + sortkey + ' return $n'
然后编译并执行这个查询,绑定$nodes
到你nodeSet
从第一个查询中获得的。
我认为您的代码失败的原因是元素位于名称空间中,并且当您构造一个 QName 来保存排序键时,您正在构造一个无名称空间 QName。
添加回答
举报
0/150
提交
取消