2

使用 xPath,我从 html 字段中获取数据,这些数据可以是这种格式(包括括号):

数据 |||| 我用来解释我的代码的符号

(出生地,出生日期-死亡日期)|||| (str, AB) = 注意 str 也可能包含 '-'

(出生地点, 出生日期) |||| (str, A)

(出生地) |||| (字符串)

(出生日期-死亡日期) |||| (AB)

(出生日期) |||| (一种)

或完全空

我正在尝试使用多个 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

在此先感谢您的帮助 :)

4

2 回答 2

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 ...
于 2012-07-26T12:03:54.500 回答
2

您的let子句后跟表达式(以 开头if),这是无效的语法 -return缺少 a 使其成为完整的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}"/>

有关详细信息,请参阅正则表达式规范和相应的XQuery 函数

于 2012-07-26T11:28:41.287 回答