2013-04-30 31 views
2

我需要使用XPath来选择从以下字符串日期:在短语中选择日期的正确Xpath子字符串是什么?

44KB - 先生李四 - 13年1月1日

我不相信你可以选择的“第三次迭代 - '为类似

substring-after($string, '-'[3]) 

我该怎么做?有没有办法从第一个'/'之前的空间抓取子字符串到日期结束?

在此先感谢

回答

1

如果只有两个短划线,在所提供的例子中,一个可以简单地使用这个XPath 1.0表达式

substring-after(substring-after('44kb - Mr John Doe - 1/1/13', '- '), '- ') 

如果已知该日期是什么串结尾,和日期的长度为6,则可以使用

substring('44kb - Mr John Doe - 1/1/13', string-length('44kb - Mr John Doe - 1/1/13') -5) 

备选地

translate(substring('44kb - Mr John Doe - 1/1/13', 
        string-length('44kb - Mr John Doe - 1/1/13') -7), 
     '- ', '') 

这里我们不知道日期的长短,所以我们取最后的8个字符,在这些我们删除任何破折号或空格。

+0

这工作。我不得不弄乱字符串的长度,但它的确有窍门。就这样我理解了这里发生的三件事情:字符串长度给了我一个包含字符串长度的数值。子串-7给我......字符串的后半部分......字符串中的最后八个位置......?并翻译删除破折号或空格?感谢Dimitre的帮助! – 2013-05-01 20:20:08

+1

@rally_point,是的,基本上,你的理解是正确的:如果我们事先不知道实际的日期长度,我们采用最大可能的长度(8)并从这个子字符串中删除任何破折号或空格。也可以从这个字符串中删除任何非数字和非斜杠字符,但这有点复杂(“双重翻译”方法)。 – 2013-05-01 21:26:26

2

fn:substring-after(...)只分裂一次,所以你将不得不申请两次了。

substring-after(substring-after('44kb - Mr John Doe - 1/1/13', ' - '), ' - ') 

如果您的XPath处理器支持它(至少XPath 2.0中),您还可以使用fn:tokenize(...)拆分到各个部位,然后使用位置谓词来获取第三个。

tokenize("44kb - Mr John Doe - 1/1/13", ' - ')[3] 

如果零件的数量可以改变,但日期总是最后一个,你也可以使用

tokenize("44kb - Mr John Doe - 1/1/13", ' - ')[last()] 

总是最后部分匹配。

+0

我无法使用2.0 Xpath处理器,但是您的第一个示例使我拍了额头。只是嵌套两个substring-after函数。我应该意识到这将起作用。当然,如果有例子,在字符串中有三个破折号,这将不会抓住他们,但我没有遇到过任何一个。谢谢! – 2013-05-01 20:25:22

相关问题