Java dom4j XPath不是节点类型

Java dom4j XPath不是节点类型,java,xpath,dom4j,Java,Xpath,Dom4j,我尝试只获取属性的一部分(也可以是元素的一部分),但目前为止运气不佳。我得到的异常是“无效的XPath表达式://@att/tokenize(,'')[.][position()=1]预期的节点类型”。我正在使用dom4j1.6.1 import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.XPath; import org.do

我尝试只获取属性的一部分(也可以是元素的一部分),但目前为止运气不佳。我得到的异常是“无效的XPath表达式://@att/tokenize(,'')[.][position()=1]预期的节点类型”。我正在使用dom4j1.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);
    }

}
要么

有什么想法吗?

使用

//*/substring-before(@att, ' ')

在axis步骤中应用函数是XPath 2.0的一个特性;Java(和dom4j)只支持XPath1.0。你不能这样做

如果只需要一个结果,请在(//@att,,)之前使用
子字符串。
。否则,将整个属性值传递给Java,并在XPath外部执行字符串操作


您可以考虑使用java API来插入一个更强大的XPath/XQuery引擎,如Saxon、BaseX或其他原生XML数据库。您的表达式将正常工作。

感谢您的回复,但我得到了相同的错误:无效的XPath表达式://*/substring before(@att,”)预期的节点类型这与原始查询的问题完全相同。好的,感谢您的澄清。事实上,“substring before”示例正在发挥作用。但是,看起来我需要tokenize函数,因为如果属性只包含一个单词,我还需要返回值。如果根本找不到分隔符,“substring-before()”将不返回任何内容。
tokenize
是另一个XPath 2.0函数。;)是的,我知道。我只是想指出一个明显的事实,那就是我必须使用支持XPath2.0的东西。
//*/substring-before(@att, ' ')