猿问

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

要在 Saxon 中对查询进行排序,我们首先运行查询:


XPathExecutable exe = xPath.compile(query);

XPathSelector selector = exe.load();

selector.setContextItem(xmlDocument);

XdmValue nodeSet = selector.evaluate();


// put the results in an array

ArrayList<XdmItem> nodes = new ArrayList<XdmItem>();

for (int i = 0; i < nodeSet.size(); i++)

    nodes.add(nodeSet.itemAt(i));


// Sort the results

sortNodes(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()?


慕勒3428872
浏览 80回答 1
1回答

摇曳的蔷薇

为什么不使用 XQuery 进行排序?生成和编译查询'declare&nbsp;variable&nbsp;$nodes&nbsp;external; for&nbsp;$n&nbsp;in&nbsp;$nodes&nbsp;order&nbsp;by&nbsp;$n/'&nbsp;+&nbsp;sortkey&nbsp;+&nbsp;'&nbsp;return&nbsp;$n'然后编译并执行这个查询,绑定$nodes到你nodeSet从第一个查询中获得的。我认为您的代码失败的原因是元素位于名称空间中,并且当您构造一个 QName 来保存排序键时,您正在构造一个无名称空间 QName。
随时随地看视频慕课网APP

相关分类

Java
我要回答