以下是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
的出现次数。此字可以是任何格式,例如 - Today
,today
,TODAY
或toDay
。最后一个是不正确的,但如果用户输入这样的话,就不应该错过。
我正在使用查询 -
count(/Datas/Data[contains(translate(Desc,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXY'), 'TODAY')])
这是结果2,但总共有3个!!如何包括所有?
答案 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"])
其他好处是此查询将能够使用全文索引,这将比为每个查询标记文档快得多。请记住在没有大小写的情况下设置全文索引。