使用xPath,我从html字段获取数据,这些数据可以采用这种格式(包括括号):
DATA ||||我用来解释我的代码的符号
(bornPlace,bornDate-DeathDate)|||| (str,A-B)=注意str也可以包含' - '
(bornPlace,bornDate)|||| (str,A)
(bornPlace)|||| (STR)
(bornDate-DeathDate)|||| (A-B)
(bornDate)|||| (A)
或完全清空
我正在尝试使用多个if-else语句将每个元素检索到单独的变量中,但似乎它不喜欢多行命令(我想是这样)。
我已经制作了一个不起作用的代码: - /(它表示期待返回,如果......就找到了其他代码)
let $temp1 := data(normalize-space(substring-before(substring-after(//div/div[2]/h2/text(), '('), ')')))
if (contains($temp1,',')) (: (str, A-B) or (str, A) :)
then
let $bornPlace := substring-before($temp1, ',')
let $temp2 := substring-after($temp1, ',')
if (contains($temp2,'-'))
then
let $bornDate := substring-before($temp2, '-')
let $deathDate := substring-after($temp2, '-')
else
let $bornDate := $temp2
let $deathDate := data('')
else if (contains($temp1,'-'))
then (: (s-t-r) or (A-B) :)
let $temp2 := normalize-space(substring-before($temp1, '-'))
if (number($temp2)=$temp2) (: it's a number :)
then
let $bornDate := temp2
let $deathDate := normalize-space(substring-after($temp2, '-'))
let $bornPlace := data('')
else
let $bornPlace := $temp1
let $bornDate := data('')
let $deathDate := data('')
else (: (str) or (A) :)
if (number($temp1)=$temp1) (: it's a number :)
then
let $bornDate := temp1
let $deathDate := data('')
let $bornPlace := data('')
else
let $bornPlace := $temp1
let $bornDate := data('')
let $deathDate := data('')
此外,如果有更美妙的方式,我会接受它:D
提前感谢您的帮助:)
答案 0 :(得分:6)
let子句不是表达式。你需要改变这种逻辑
if (contains($temp2,'-'))
then
let $bornDate := substring-before($temp2, '-')
let $deathDate := substring-after($temp2, '-')
else
let $bornDate := $temp2
let $deathDate := data('')
由此
let $hyphenated := contains($temp2, '-')
let $bornDate := if ($hyphenated) then substring-before($temp2, '-') else $temp2
let $deathDate := if ($hyphenated) then substring-after($temp2, '-') else ''
return ...
虽然在这种特殊情况下我会倾向于写:
let $tokens := tokenize($temp2, '-')
let $bornDate := $tokens[1]
let $deathDate := string($tokens[2])
return ...
答案 1 :(得分:2)
您的let
子句之后是表达式(从if
开始),这是无效的语法 - 缺少return
使其成为完整的FLWOR
表达式。
此外,变量在内部范围中定义,并且它们的绑定不会到达外部范围,这不是很有用。
虽然它们很容易变得神秘,但这可能是正则表达式的一种情况,例如
for $input in
(
"Capetown, 10/04/1932-01/14/2002",
"Taipeh, 05/31/1988",
"Anchorage",
"08/19/1918-07/02/1997",
"12/22/1978"
)
let $bornPlace := replace($input, ",.*$|^[-0-9/]+$", "")
let $bornDate := replace($input, "^.*, |-[0-9/]+$|^[^0-9][^,]+$", "")
let $DeathDate := replace($input, "^.*[0-9]+-|^.*,[^-]*$|^[^,-]+$", "")
return <test input="{$input}"
bornPlace="{$bornPlace}"
bornDate="{$bornDate}"
DeathDate="{$DeathDate}"/>
有关详细信息,请参阅regular expressions的规范和相应的XQuery functions。