在python中评估Xpath2.0

时间:2018-10-08 17:37:55

标签: python xpath xslt-2.0 xpath-2.0

我有一个如下所示的XPath表达式。

if(replace(//p[1]/text(),'H','h') = 'hello') then //p[1]/text() else if(//p[1]/text() = 'world') then //p[2]/text() else 'notFound'

我想显示哪个'if'表达式有效。

e.g //p[1]/text() if first 'if' expression worked.

'if'表达式可以嵌套for,for循环和xpath2.0函数。

我找不到用于python的任何xpath2.0库。因此,我尝试将Js library转换为python,但仍然可以将xpath2.0表达式拆分为词法分析器,但无法将其完全转换为python。

建议我为python使用一些Xpath2.0库(如果有)。 还有如何解释XPath表达式并显示该表达式的哪个部分起作用?

2 个答案:

答案 0 :(得分:3)

您已经知道,lxml是Python XML / XPath支持的基石,仅功能

  

通过libxml2和libxslt的XPath 1.0,XSLT 1.0和EXSLT扩展

我们还有一些选择。

我最近研究了这个主题(特别是Python的XQuery支持)。
有关XML Query Implementations的参考列表,请参见W3C。

  1. 具有XPath 2+和EXSLT扩展的Python模块(例如,用于正则表达式EXSLTmatch
    some modules on PiPy部分提供XPath 2.0+功能。

  2. 有一些实现XPath / XQuery 2.0功能的OSS XML / NoSQL-DBMS,例如

    • Zorba,XQuery 1.0 / 2.0的一种开放源代码可移植的可嵌入C ++实现,具有Python绑定(此question具有一些指针),
    • 以及Sedna和一些商业DBMS。根据您的项目,这可能是一个不错的选择。
  3. 我相信(Saxon/CMichael Kay和Cython是最有前途的道路。之前曾在pysaxon尝试过。

  4. 您可以使用子进程来调用CLI XML处理器(如建议的here),例如subprocess.call(["saxon", "-o:output.xml", "-s:file.xml", "file.xslt"])

  5. 另一种选择是将XSLT / XPath / XQuery与Java XML classes中的saxon和/或其他Jython一起使用。

  6. 最后,您可以设置一个Web服务,以Java,.NET等语言为您完成艰苦的工作,并附带适当的XPath 3+支持(也由Kay {{3 }}。

还是有些令人失望,尤其是对于像Python这样的大型语言。

答案 1 :(得分:1)

正如Martin所提到的,我们有一个用于C / C ++ / PHP语言的Saxon产品,称为Saxon / C,已经推出了几年。我们一直在看到用户对将Saxon / C与Python结合使用感兴趣。

一个用户已经成功使用Boost.Python与我们的C ++库进行交互。 另一位用户以不同的方式完成了接口操作:https://github.com/ajelenak/pysaxon

我们希望为Python提供正式的Saxon / C接口。