3

私はこのようなxml要素のシーケンスを持っています:

<addr>via roma</addr>
<addr>via milano</addr>
<addr>via napoli</addr>
...

そして、次のように、同じ連続したアドレスを3回以上含むアドレスのシーケンスがあるかどうかを確認したいと思います。

<addr> via napoli</addr>
<addr>via roma</addr>
<addr>via roma</addr>
<addr>via roma</addr>
<addr>via milano</addr>
....

このxml要素の入力シーケンスは、xqueryの結果です。関数を使うべきだと思いますfn:matches()が、このシーケンスに一致する正規表現を書くことができません。

4

3 に答える 3

3

このクエリ(およびXpath 3.0式)はtrue()、シーケンス$seqに同じ文字列値を持つ$n個以上の連続したアイテムが含まれている場合に正確に生成されます。

    boolean($seq
              [some $i in 1 to count($seq) -($n -1)
                 satisfies
                    not(distinct-values(subsequence($seq, $i, $n))[2])
              ]
             )

したがって、この特定のケースでは

let $n := 3,
    $seq := /*/addr
 return
        boolean($seq
                  [some $i in 1 to count($seq) -($n -1)
                     satisfies
                        not(distinct-values(subsequence($seq, $i, $n))[2])
                  ]
                 )

を生成します

true
于 2012-10-25T14:21:38.587 に答える
2

正規表現は必要ありません。が要素$addrsのシーケンスである場合、addr

for $a at $i in $addrs
  let $text := string($a)
  where string($addrs[($i + 1)]) eq $text and string($addrs[($i + 2)]) eq $text
  return ($i, $a)

$addrsこの場合、3つの等しい連続したアドレスのサブシーケンスが始まる要素とインデックスを提供します(2, <addr>via roma</addr>)

長さが4を超えるそのようなサブシーケンスがに存在する場合、重複するアドレスを取得することに注意してください$addrs

于 2012-10-25T11:34:08.997 に答える
1

正規表現パターンを使用する

<addr>([^<>]*)<\/addr>\s*<addr>\1<\/addr>\s*<addr>\1<\/addr>
于 2012-10-25T11:35:50.713 に答える