【问题标题】:Counting ocurrences of certain words case-insensitive in an XML element计算 XML 元素中某些不区分大小写的单词的出现次数
【发布时间】:2012-08-06 05:42:42
【问题描述】:

以下是 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 个!如何包含所有?

【问题讨论】:

    标签: xml xpath xquery basex


    【解决方案1】:

    这个算3:

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

    它使用fn:upper-case 进行大小写规范化,并使用fn:tokenize 隔离单词。请注意,此处的单词需要用非字母分隔,其行为与使用 fn:contains 的原始查询不同。不过,这可能是您想要的。

    【讨论】:

      【解决方案2】:

      如果你使用 BaseX(我记得你就是这样),你可以使用非标准的 ft:count,这让生活更轻松。

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

      额外的好处是这个查询将能够使用全文索引,这将比为每个查询标记文档要快得多。请记住设置不大写的全文索引。

      【讨论】:

        猜你喜欢
        • 2021-12-01
        • 2021-09-10
        • 1970-01-01
        • 2023-04-04
        • 2015-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多