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

似乎可以使用xpath中所有丰富的功能来执行“ if”操作。但是,我的引擎一直坚持“没有这样的功能”,而且我在网上几乎找不到任何文档(我发现了一些可疑的资源,但是它们的语法没有用)


我需要从字符串的末尾删除“:”(如果存在),所以我想这样做:


if (fn:ends-with(//div [@id='head']/text(),': '))

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

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

有什么建议吗?


尚方宝剑之说
浏览 1140回答 3
3回答

慕田峪9158850

是的,在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]更具防御性。

德玛西亚99

根据pkarat的法律,您可以在1.0版中实现条件XPath。对于您的情况,请遵循以下概念:concat(substring-before(your-xpath[contains(.,':')],':'),your-xpath[not(contains(.,':'))])这肯定会起作用。看看它怎么运作。给出两个输入praba:karan对于第一个输入:它包含的:条件为true,字符串before : 将作为输出,比如说praba您的输出。第二条件为假,因此没有问题。对于第二个输入:它不包含,:因此条件失败,到第二个条件时,字符串不包含,:因此条件为true ...因此karan将抛出输出。最后,你的输出会praba,karan。
打开App,查看更多内容
随时随地看视频慕课网APP