首页 文章

使用XQuery计算字符串中出现的单词数

提问于
浏览
0

我们有一个非常相似的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<nodeOne>
  <nodeTwo>
    <nodeThree>
      foo bar zoo
    </nodeThree>
  </nodeTwo>
</nodeOne>
<nodeOne>
  <nodeTwo>
    <nodeThree>
      foo bar
    </nodeThree>      
  </nodeTwo>
</nodeOne>
<nodeOne>
  <nodeTwo>
    <nodeThree>
      zoo bar
    </nodeThree>      
  </nodeTwo>
</nodeOne>

我想要实现的是计算 nodeThree 内每个单词的出现次数(由空格分隔) . 考虑到上面的例子,输出将是这样的:

foo 2
bar 3
zoo 2

我试图获取每个 text()nodeThree ,并试图将它变成字符串序列 . 然后,我想,我可能能够加入他们和团队,然后计算,但我无法这样做 . 到目前为止尝试了很多东西 .

1 回答

  • 2

    首先请注意,除非您创建一个根节点来包装它,否则您的XML格式不正确(即它不是真正的XML) .

    如果性能是一个问题,这个问题更适合利用带有频率数据的单词索引,就像在XML数据库中一样 . 在纯XQuery中解决这个问题对于大型XML来说可能要慢得多,但解决了这个问题:

    let $xml :=
        <root>
        <nodeOne>
          <nodeTwo>
            <nodeThree>
              foo bar zoo
            </nodeThree>
          </nodeTwo>
        </nodeOne>
        <nodeOne>
          <nodeTwo>
            <nodeThree>
              foo bar
            </nodeThree>      
          </nodeTwo>
        </nodeOne>
        <nodeOne>
          <nodeTwo>
            <nodeThree>
              zoo bar
            </nodeThree>      
          </nodeTwo>
        </nodeOne>
        </root>
    let $toks := $xml//text()/fn:tokenize(fn:normalize-space(.),'\s')
    for $t in distinct-values($toks)
    let $count := count($toks[. = $t])
    return element { $t } {
        attribute count { $count }
    } 
    =>
    <foo count="2"/>
    <bar count="3"/>
    <zoo count="2"/>
    

相关问题