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 бази данни с налични Java API.

person Jens Erat    schedule 25.02.2014
comment
Добре, благодаря за пояснението. Наистина, примерът подниз-преди работи. Изглежда обаче, че имам нужда от функцията за токенизиране, тъй като също искам върната стойност, ако атрибутът съдържа само една дума. 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