dom4j XPath не является узлом

Я пытаюсь получить только часть атрибута (также может быть частью элемента), но пока безуспешно. Я получаю исключение: «Недопустимое выражение XPath: //@att/tokenize(., ' ')[.][position() = 1] Ожидаемый тип узла». Я использую dom4j 1.6.1.

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.XPath;
import org.dom4j.xpath.DefaultXPath;


public class TestXPathString {

    /**
     * @param args
     * @throws DocumentException 
     */
    public static void main(String[] args) throws DocumentException {
        Document doc = DocumentHelper
                .parseText("<x><y att='I just need the first word' /></x>");
        XPath xpath = new DefaultXPath("//@att/tokenize(., ' ')[.][position() = 1]");
        Object result = xpath.evaluate(doc);
        System.out.printf("Type: %s, Value: %s\n", result.getClass()
                .getSimpleName(), result);
    }

}

Это не работает с

doc.selectObject("//@att/substring-before(., ' ')");

либо.

Есть идеи?


person Isabi    schedule 25.02.2014    source источник


Ответы (3)


Применение функций в шагах оси — это функция XPath 2.0; Java (и dom4j) поддерживают только XPath 1.0. Ты не сможешь это сделать.

Если вы ожидаете только один результат, используйте substring-before(//@att, ' '). В противном случае передайте все значение атрибута в Java и выполните манипуляции со строками вне XPath.

Вы можете подумать о подключении более мощного движка XPath/XQuery, такого как Saxon, BaseX или другие собственные базы данных XML с доступными API Java.

person Jens Erat    schedule 25.02.2014
comment
Хорошо, спасибо за разъяснения. Действительно, пример substring-before работает. Однако похоже, что мне нужна функция tokenize, так как я также хочу возвращаемое значение, если атрибут содержит только одно слово. substring-before() ничего не возвращает, если разделитель вообще не найден. - person Isabi; 25.02.2014
comment
tokenize — еще одна функция XPath 2.0. ;) - person Jens Erat; 25.02.2014
comment
Да, я знаю. Просто хотел указать на очевидное, что мне определенно нужно использовать что-то, поддерживающее XPath 2.0. - person Isabi; 26.02.2014

использовать

//*/substring-before(@att, ' ')
person Joel M. Lamsen    schedule 25.02.2014
comment
Спасибо за ответ, но я получаю ту же ошибку: Недопустимое выражение XPath: //*/substring-before(@att, ' ') Ожидаемый тип узла - person Isabi; 25.02.2014
comment
Это имеет ту же проблему, что и исходный запрос. - person Jens Erat; 25.02.2014

Вы можете использовать механизм Saxon XPath 2.0 для запроса DOM4J. Тогда ваше выражение будет работать.

person Michael Kay    schedule 25.02.2014