要在 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() 調(diào)用上都返回 false。第一個問題,這是執(zhí)行此操作的最佳方式嗎?如果沒有,有什么更好的方法?第二個問題,如果這是最好的方法,為什么迭代器返回 false ofr hasNext()?
1 回答

搖曳的薔薇
TA貢獻1793條經(jīng)驗 獲得超6個贊
為什么不使用 XQuery 進行排序?生成和編譯查詢
'declare variable $nodes external; for $n in $nodes order by $n/' + sortkey + ' return $n'
然后編譯并執(zhí)行這個查詢,綁定$nodes
到你nodeSet
從第一個查詢中獲得的。
我認(rèn)為您的代碼失敗的原因是元素位于名稱空間中,并且當(dāng)您構(gòu)造一個 QName 來保存排序鍵時,您正在構(gòu)造一個無名稱空間 QName。
添加回答
舉報
0/150
提交
取消