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并尝试将tokenize()其转换为字符串序列。然后,我想,我也许可以加入他们并分组,然后数数,但我不能这样做。到现在为止尝试了很多东西。

4

1 回答 1

2

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

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

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"/>
于 2013-02-27T21:50:21.973 回答