用xquery

时间:2016-03-24 14:15:00

标签: lucene xquery

在下面的xquery中,一切都按预期工作,但在下面的行中显示为:

<h2>Total word count: {format-number($sum, "0")}</h2> 

如果总和超过一百万,则显示为:

&#34; 1.516908E6&#34;

我不明白这个数字。例如,为什么会有&#34; E&#34;?

任何低于一百万的印刷品都按预期印刷,例如:

&#34; 72188&#34;为72,188。

我可能遗漏了一些基本的东西,但我会感激任何帮助。

开始xquery

xquery version "3.0";

declare namespace tei="http://www.tei-c.org/ns/1.0";

declare option exist:serialize "method=html media-type=text/html ident=no";

let $commentaryid := request:get-parameter('commentaryid', '')
let $collection := concat("scta", "/", $commentaryid)
let $terms := 
    <terms>
        {
            util:index-keys(
                collection(concat("/db/apps/", $collection))//tei:p, 
                "",
                function($key, $count) {
                    <term name="{$key}" count="{$count[1]}"
                        docs="{$count[2]}"/>
                }, -1, "lucene-index")
        }
    </terms>

let $sum := sum($terms//@count)
return 
    <html>
        <head>

        </head>
        <body>
            <h1>Frequency analysis for {$collection}</h1> 
                <h2>Total word count: {format-number($sum, "0")}</h2>
            <table>
                <tr>
                    <td>Term</td>
                    <td>Frequency</td>
                    <td>Percentage</td>
                </tr>
                {
                    for $term in $terms//term

                        let $frequency := xs: integer($term/@count/string())
                        let $percentage := format-number(($term/@count div $sum), "%.00")
                        order by $frequency descending
                        return

                            <tr>
                                <td>{$term/@name/string()}</td>
                                <td>{$frequency}</td>
                                <td>{$percentage}%</td>
                            </tr>
                }
                </table>
                </body>
                </html>

1 个答案:

答案 0 :(得分:0)

将xs:double转换为字符串的XPath规则表示,小于百万分之一或超过一百万的数字应格式化为“科学记数法”。如果这不是您想要的,那么最好将数字转换为整数或小数 - 最好尽早。在您的情况下,转换为xs:double隐含地发生在您编写

的位置
sum($terms//@count)

您可以使用

来避免它
sum($terms//xs:integer(@count))

<强>后记

我认为我没有仔细阅读你的问题。我没有看到你实际上是在调用format-number()来输出值。除非您明确要求,否则format-number不应以指数/科学记数法生成输出。所以这里还有其他的东西,这可能是eXist特有的。