2016-11-09 7 views
1

У меня возникают проблемы с функцией distinct-values ​​().XQuery - distinct-values ​​() избавляется от моей таблицы

for $b in doc("KS0.xml") /bncDoc/stext/div/u/s/w 
    let $c := normalize-space(lower-case($b)) 
    where $c = "has" 
    return <tr><td>{$c}</td><td>{$b/following-sibling::w[1]}</td><td></td></tr> 

Код выше дает мне следующий HTML вывод:

<?xml version="1.0" encoding="UTF-8"?> 
<table> 
    <tr> 
     <th>Target</th> 
     <th>Successor</th> 
     <th>Frequency</th> 
    </tr> 
    <tr> 
     <td>has</td> 
     <td> 
     <w c5="AV0" hw="there" pos="ADV">there</w> 
     </td> 
     <td/> 
    </tr> 
    <tr> 
     <td>has</td> 
     <td> 
     <w c5="AT0" hw="a" pos="ART">a </w> 
     </td> 
     <td/> 
    </tr> 
</table> 

Где она имеет 3 колонки, но когда я использую различные стоимостей() следующим образом:

distinct-values(
    for $b in doc("KS0.xml") /bncDoc/stext/div/u/s/w 
    let $c := normalize-space(lower-case($b)) 
    where $c = "has" 
    return <tr><td>{$c}</td><td>{$b/following-sibling::w[1]}</td><td></td></tr> 
    ) 

Я получаю это:

<?xml version="1.0" encoding="UTF-8"?> 
<table> 
    <tr> 
     <th>Target</th> 
     <th>Successor</th> 
     <th>Frequency</th> 
    </tr>hasthere hasn't haslarge hasbeen hasgone hasdone hasa hasalthough hasintentions hasjust hasgot hasto hasnow hasin hastropical hassince hasdare </table> 
+0

Вы на самом деле не сказали, чего вы пытаетесь достичь. Вы только показали код, который этого не достигает. –

ответ

2

Функцияработает только на атомных значениях, если вы кормите XML-фрагменты, они неявно распыляются.

Чтобы решить вашу оригинальную проблему, не считая одной и той же строки более одного раза, вам либо нужно представлять строки как атомные значения (например, строки), либо как-то проверить их для уникальности, либо вы можете использовать fn:deep-equal($seq1, $seq2) для сравнения XQL структурно.

Если вы выбрали подход с атомными идентификаторами, то для ускорения проверки уникальности можно использовать карту XQuery 3.0 с уже увиденными идентификаторами. Другая идея заключалась бы в использовании group by для сбора эквивалентных строк и вывода одной строки для каждой группы.