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でこれを解決すると、大規模な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"/>
于 2013-02-27T21:50:21.973 に答える