为了账号安全,请及时绑定邮箱和手机立即绑定

试图对撒克逊的节点集进行排序

试图对撒克逊的节点集进行排序

慕勒3428872 2022-06-23 16:01:23
要在 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。


查看完整回答
反对 回复 2022-06-23
  • 1 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信