计算XML元素中不区分大小写的某些单词的出现次数

时间:2012-08-06 05:42:42

标签: xml xpath xquery basex

以下是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中,我想计算单词today的出现次数。此字可以是任何格式,例如 - TodaytodayTODAYtoDay。最后一个是不正确的,但如果用户输入这样的话,就不应该错过。

我正在使用查询 -

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

这是结果2,但总共有3个!!如何包括所有?

2 个答案:

答案 0 :(得分:2)

这个计算3:

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

它使用fn:upper-case进行大小写归一化,使用fn:tokenize来隔离单词。请注意,此处的单词需要用非字母分隔,这些字母的行为与使用fn:contains的原始查询不同。那可能就是你想要的。

答案 1 :(得分:1)

如果你正在使用BaseX(你记得那么),你可以使用非标准的ft:count,这会让生活变得更轻松。

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

其他好处是此查询将能够使用全文索引,这将比为每个查询标记文档快得多。请记住在没有大小写的情况下设置全文索引。