2

xPath を使用して、html フィールドからデータを取得しています。このデータは、次の形式 (かっこを含む) にすることができます。

データ |||| コードを説明するために使用している記号

(bornPlace、bornDate-DeathDate) |||| (str, AB) = 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) が続きますが、これは有効な構文ではありません。完全な式にするために aが欠落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}"/>

詳細については、正規表現の仕様と対応するXQuery 関数を参照してください。

于 2012-07-26T11:28:41.287 に答える