1

以下は、XML ファイルの構造です。

<Datas>
  <Data>
    <Name>Information</Name>
    <Desc>Today is Monday, the starting day of the week.</Desc>
  </Data>
  <Data>
    <Name>Stackoverflow.com</Name>
    <Desc>Yesterday 1200 questions were posted. <b>TODAY</b>, till now 1300 questions are posted. So, today will be an important day for all the senior members.</Desc>
  </Data>
</Datas>

上記の XML で、 word の出現回数をカウントしたいと考えていますtodayTodayこの単語は、 - 、todayTODAYまたはのような任意の形式にすることができますtoDay。最後の 1 つは正しくありませんが、ユーザーがこのように入力した場合、見逃すことはできません。

私はクエリを使用しています -

count(/Datas/Data[contains(translate(Desc,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXY'), 'TODAY')])

これは結果 2 ですが、全部で 3 です !! すべてを含める方法は?

4

2 に答える 2

2

これは 3 と数えます。

count(/Datas/Data//text()/tokenize(upper-case(.), "[\P{L}]")[. = "TODAY"])

大文字と小文字の正規化にfn:upper-caseを使用し、単語を分離するためにfn:tokenizeを使用します。ここでの単語は、文字以外で区切る必要があることに注意してください。これは、fn:containsを使用した元のクエリとは異なる動作をします。しかし、それはあなたが望むものかもしれません。

于 2012-08-06T08:19:32.153 に答える
1

BaseX を使用している場合 (私が覚えているとおりです)、非標準ft:countを使用すると、作業が大幅に楽になります。

ft:count(//*[text() contains text "today"])

追加の利点は、このクエリが全文索引を使用できることです。これは、クエリごとにドキュメントをトークン化するよりもはるかに高速です。大文字を使用せずに全文索引を設定することを忘れないでください。

于 2012-08-06T08:24:50.053 に答える