dom4j XPath不是节点类型

时间:2014-02-25 08:50:23

标签: java xpath dom4j

我尝试只获取属性的一部分(也可能是元素的一部分),但到目前为止还没有运气。我得到的例外是“无效的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(., ' ')");

或者

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

在轴步骤中应用函数是XPath 2.0的一项功能; Java(和dom4j)仅支持XPath 1.0。你不能这样做。

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

您可以考虑使用Java API插入更强大的XPath / XQuery引擎,如Saxon,BaseX或其他原生XML数据库。

答案 1 :(得分:0)

使用

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

答案 2 :(得分:0)

您可以使用Saxon XPath 2.0引擎查询DOM4J。那么你的表达就可以了。