我正在尝试用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提供的xpath1.c
示例工具,并得到了相同的错误信息:
$ ./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脚本,并得到了相同的结果。
libxml
XPath实现仅为XPath 1.0,因此exists
等仅为2.0的函数不可用。在1.0中,你只有几个核心函数——有starts-with
但没有ends-with
,没有正则表达式支持,没有日期处理等,没有强类型,没有if
和for
这样的高级结构。
所以回答你的问题,是的,确实支持整个XPath,但只支持XPath 1.0。