2

使用 xPath 我得到这样的文本:

sed id felis mi; Nam porta lacinia sapien vestibulum egestas;Praesent nec nisl purus,eget mollis metus。Fusce euismod ante id Tellus tincidunt dignissim ornare magna blandit。Nunc id risus quam。

我想把它分成两个变量:

var1 = 从开头到第一个点的文本 => 如果这部分包含超过 10 个单词(由空格分隔)并包含分号“;”,那么它将从开头到第一个分号。

var2 = 文本的右侧部分。

我从这段代码开始,但它没有给我想要的东西(我还没有处理 10 个单词的条件):

let $left := data(tokenize($doc//div/blockquote/p/text(), '^(.*?)[;|.](.*?)$')[1])
let $right := data(tokenize($doc//div/blockquote/p/text(), '^(.*?)[;|.](.*?)$')[2])

提前致谢。

4

2 回答 2

4

tokenize()即使不使用或任何正则表达式也可以完成:

   for $s in 'Sed id felis mi; Nam porta lacinia sapien vestibulum egestas; Praesent nec nisl purus, eget mollis metus. Fusce euismod ante id tellus tincidunt dignissim ornare magna blandit. Nunc id risus quam.',
       $vBeforeDot in substring-before($s, '.'),
       $vBeforeSemiC in substring-before($s, ';')
      return
         ($vBeforeDot
                       [string-length(normalize-space(.))
                       - string-length(translate(normalize-space(.), ' ', ''))
                       le 9
                       ],
        $vBeforeSemiC
        )[1]
于 2012-07-26T13:33:01.120 回答
3

尝试这个

for $p in doc('file:///c:/test.xml')//div/blockquote/p/text()
    return 
        if (count(tokenize(tokenize($p,'[.]')[1],'\s+')) gt 10) then
            (tokenize($p,'[.]')[1])
        else
            (tokenize($p,';')[1])

有关参考,请参阅fn:tokenize

于 2012-07-26T12:38:52.117 回答