为了账号安全,请及时绑定邮箱和手机立即绑定

XPath中是否有“ if -then-else”语句?

XPath中是否有“ if -then-else”语句?

尚方宝剑之说 2019-12-04 11:19:39
似乎可以使用xpath中所有丰富的功能来执行“ if”操作。但是,我的引擎一直坚持“没有这样的功能”,而且我在网上几乎找不到任何文档(我发现了一些可疑的资源,但是它们的语法没有用)我需要从字符串的末尾删除“:”(如果存在),所以我想这样做:if (fn:ends-with(//div [@id='head']/text(),': '))            then (fn:substring-before(//div [@id='head']/text(),': ') )            else (//div [@id='head']/text())有什么建议吗?
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

是的,在XPath 1.0中有一种方法可以做到:


concat(

  substring($ s1,1,number($ condition)*字符串长度($ s1)),

  substring($ s2,1,number(not($ condition))*字符串长度($ s2))

这依赖于两个互斥字符串的串联,如果条件为false(0 * string-length(...)),则第一个为空,如果条件为true,则第二个为空。这被称为“贝克尔方法”,归因于奥利弗·贝克尔。


在您的情况下:


concat(

  子串(

    substring-before(// div [@ id ='head'] / text(),':'),

    1, 

    数(

      结尾为(// div [@ id ='head'] / text(),':')

    )

    * string-length(substring-before(// div [@ id ='head'] / text(),':'))

  ),

  子串(

    // div [@ id ='head'] / text(), 

    1, 

    编号(不(

      结尾为(// div [@ id ='head'] / text(),':')

    ))

    *字符串长度(// div [@ id ='head'] / text())

  )

虽然我会尝试摆脱"//"以前的所有情况。


同样,有可能//div[@id='head']返回多个节点。

请注意,使用//div[@id='head'][1]更具防御性。


查看完整回答
反对 回复 2019-12-04
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

根据pkarat的法律,您可以在1.0版中实现条件XPath。


对于您的情况,请遵循以下概念:


concat(substring-before(your-xpath[contains(.,':')],':'),your-xpath[not(contains(.,':'))])

这肯定会起作用。看看它怎么运作。给出两个输入


praba:

karan

对于第一个输入:它包含的:条件为true,字符串before : 将作为输出,比如说praba您的输出。第二条件为假,因此没有问题。


对于第二个输入:它不包含,:因此条件失败,到第二个条件时,字符串不包含,:因此条件为true ...因此karan将抛出输出。


最后,你的输出会praba,karan。


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 1139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信