XPath - сокращение функции position () - PullRequest
5 голосов
/ 23 сентября 2011

Может кто-нибудь объяснить, в чем разница между

/root/a[position()=1 or position()=2

и

/root/a[1 or 2]

?Я бы предположил, что 2nd является сокращенной формой 1st, но процессор Java XPath (Sun JDK 1.6.0) считает иначе.Ниже приведено мое тестовое приложение. Библиотека

libxml2, а также процессор XPath db2 также считают эти пути различными.Так что это не похоже на ошибку JDK.

import java.io.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;

import org.xml.sax.InputSource;

public class XPathTest {
    public static void main(String[] args) throws Exception {
        //String xpathStr = "/root/a[position()=1 or position()=2]";
        String xpathStr = "/root/a[1 or 2]";

        XPathFactory xpf = XPathFactory.newInstance();
        XPath xp = xpf.newXPath();
        Reader irdr = new StringReader(
                "<root><a name=\"first\"/><a name=\"second\"/><a name=\"third\"/></root>");
        InputSource isrc = new InputSource(irdr);
        XPathExpression expr = xp.compile(xpathStr);
        Object result = expr.evaluate(isrc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;
        for (int i = 0; i < nodes.getLength(); i++) {
            Node node = nodes.item(i);
            Element element = (Element) node;
            System.out.print(element.getNodeName() + " " + element.getAttributeNode("name"));
           System.out.println();
        }
    }
}

Ответы [ 4 ]

4 голосов
/ 23 сентября 2011

Я не думаю, что [1 or 2] оценивает, как вы думаете, это оценивает. or работает с двумя логическими значениями. Я подозреваю, что оба значения 1 и 2 оцениваются как истинные. Следовательно, это выражение оценивается как истинное и по сути ничего не делает и возвращает все элементы.

Как правило, position() может использоваться в выражениях типа [position() <= 5], тогда как индексный адрес может выбирать только один элемент, например [5].

2 голосов
/ 24 сентября 2011

Если значение в квадратных скобках является числом [N], оно интерпретируется как [position()=N].Но [1 or 2] не является числом, поэтому это правило не применяется.

1 голос
/ 23 сентября 2011

[1 or 2] также оценивается как «всегда истинный» предикат в .Net, поэтому такое поведение выглядит согласованным:

Вот вывод из XPath .NET 3.5 XmlDocument

    // Returns first, second
    var ndl = dom.SelectNodes(@"/root/a[position()=1 or position()=2]");

    // Returns first, second and third
    ndl = dom.SelectNodes(@"/root/a[1 or 2]");

    // Returns first, second
    ndl = dom.SelectNodes(@"/root/a[1] | /root/a[2]");

Редактировать

В XPath 2 вы можете использовать функции последовательности index-of и exists, чтобы определить, содержится ли данная позиция в последовательности значений:

/root/a[exists(index-of((1,2), position()))]
0 голосов
/ 23 сентября 2011

Числовое значение в [] рассматривается как индекс.OR не работает для индексов, как у вас ([1 or 2]).Правильный путь использует position().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...