在libxml中使用XPath函数

时间:2014-03-17 15:39:38

标签: xpath libxml2 xml-libxml

我正在尝试使用libxml 2.8.0评估某些XPath表达式,并且正在获取带有函数的错误消息。我不清楚libxml是否实现了XPath规范的整体或子集。是否有任何资源明确指出实施的内容以及如何使用它?

在我的具体案例中,我试图评估的一个表达是:

/TemporalInformation/RecipeInformation[fn:exists(./ActionToActionRelation[fn:contains(./@actionA,'cook') and fn:exists(./IngredientA[fn:contains(./@classes,'onion')])])]

我通过XML :: LibXML Perl模块使用libxml,但我也尝试使用xmlsoft.org提供的the xpath1.c example工具表达式,并得到了相同的错误消息:

$ ./xpath-tester data/fk.xml "/TemporalInformation/RecipeInformation[fn:exists(.> /ActionToActionRelation[fn:contains(./@actionA,'cook') and fn:exists(./IngredientA[fn:contains(./@classes,'onion')])])]" "fn=http://www.w3.org/2005/xpath-functions"
xmlXPathCompOpEval: function contains not found
XPath error : Unregistered function
xmlXPathCompOpEval: function exists not found
XPath error : Unregistered function
XPath error : Invalid expression
XPath error : Stack usage errror
Error: unable to evaluate xpath expression "/TemporalInformation/RecipeInformation[fn:exists(./ActionToActionRelation[fn:contains(./@actionA,'cook') and fn:exists(./IngredientA[fn:contains(./@classes,'onion')])])]"
Usage: ./xpath-tester <xml-file> <xpath-expr> [<known-ns-list>]
where <known-ns-list> is a list of known namespaces
in "<prefix1>=<href1> <prefix2>=href2> ..." format

我已尝试使用fn命名空间,使用xpath.c和我的Perl脚本,并获得了相同的结果。

1 个答案:

答案 0 :(得分:1)

libxml XPath实现只是XPath 1.0,因此exists等仅限2.0的函数不可用。在1.0中,您只有一些core functions - starts-with但不是ends-with,没有正则表达式支持,没有日期处理等等,并且没有强类型,也没有更高级别像iffor这样的结构。

所以回答你的问题,是的,它 支持整个XPath,但只支持XPath 1.0。