2012-01-06 8 views
0

私は電話番号を返す関数を持っています。これは、関数が任意の数の値を返すことができるXQueryを使用して動的表の行を生成

<td>#phone</td> 

このフォーマットで返します。 グリッドのような構造でそれらを表示したいと思います。 つまり、10個の列があるテーブル。 (関数が26レコードを返す場合は、3行、10列の2行、6列の3行)

XQueryのforステートメントのカウンタロジックを理解できませんキーワードで)。どんな助けもありがとう。

関数呼び出しが、この(関数呼び出しにいかなる変更も高く評価されている)のようなものである:

実際のコードは次のとおりです

declare function local:table-construct(
    $areacode as xs:string, 
    $uniquekey as $xs:string, 
    $doc as xs:element) as xs:element? 
{ 
    for $phno in $doc/users[$areacode eq $code and $uniquekey eq $thiskey] 
    return <td>{$phno/phone}</td> 
} 

let $doc := <an xml doc from a database> 
let $areacode := "somestring" 
let $uniquekey := "somekey" 
return 
    <html> 
    <body> 
     <table> 
     <tr>{local:table-construct($areacode, $uniquekey, $doc)}</tr> 
     </table> 
    </body> 
    </html> 

本フォーマットは私にすべての電話番号を与えます同じ行。私はテーブルに10行しか表示しません。残りのデータは次の行に格納されます。

+0

使用している実際のXQueryコードを表示できますか? – grtjn

+0

@grtjnを確認してください。私は質問のコードを追加しました – satsamsk

答えて

1

コードを入力しなかったため、「機能プログラミング」トラップにトラップされていると推測できます。 XQueryは、命令型言語で知られている変数を持たない関数型言語です。

let $x := 1 to 10 
let $sum := 0 
for $i in $x 
let $sum := $sum+$i (: here we cover $sum from line 2, do not change it :) 
return $sum 

このコードの出力は、予期しないかもしれません1 2 3 4 5 6 7 8 9 10です。 4行目には、常に$i(1〜10)と$sum(0)が追加されますが、$sumは更新されません。 $iの場合は、$sumは再び0になります。

これが問題であるならば、このようないくつかのパターンを使用して考える:

let $seq := 1 to 15 
let $dividor := 4 
for $i in 1 to ceiling(count($seq) div $dividor) cast as xs:integer 
return <tr>{ 
    for $td in subsequence($seq, ($i -1)*$dividor + 1, $dividor) 
    return <td>{$td}</td> 
}</tr> 

あなたはあなたのコードにそれを合わせて持っているかもしれないが、アイデアは問題ないはずです。

EDIT:クエリプロセッサがサポートしている場合は、sliding windowも使用できます。バージョン5.0.2以降、Marklogicはまだ動作しません。

+0

ありがとうRanon。あなたはスポットにいました。私は本当に "機能プログラミングトラップ"に閉じ込められていました。これはカウンターの背後にある論理全体を理解するのに本当に役立ちました。 – satsamsk

0

これは、あなたがxsltの中であなたの要求に従ってグループ化を行うことができます!

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="Columns" select="10"/> 

    <xsl:template match="/*"> 
    <xsl:copy> 
     <xsl:apply-templates select="phone[position() mod $Columns= 1]"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="phone"> 
    <tr> 
     <xsl:apply-templates mode="copy" select=". | following-sibling::phone[position() &lt; $Columns]"/> 
    </tr> 
    </xsl:template> 

    <xsl:template match="line" mode="copy"> 
    <td><xsl:copy-of select="."/><td> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Treemonkey。私はいつも第二の選択肢としてXSLを見ていましたが、とにかく応答に感謝し、助けに感謝します! – satsamsk

+0

あなたの非常に歓迎:)種類のコメントに感謝 – Treemonkey

0

FLWORステートメントのatキーワードは、ここではあまり役に立ちません。あなたは一度に10の列を取って、それ自身を<tr>に入れる必要があります。次のようにMarkLogicでこれを行うことの最も直接的な方法は次のとおりです。

declare function local:wrap-columns($columns, $width) { 
    let $nrrows := ceiling(count($columns) div $width) 
    for $row in 1 to $nrrows 
    let $start := ($row - 1) * $width + 1 
    let $end := $row * $width 
    return 
    <tr>{$columns[$start to $end]}</tr> 
}; 

let $columns := 
    for $i in 1 to 26 
    return <td>{$i}</td> 
return 
    local:wrap-columns($columns, 10) 

二一目で統合を行い、簡単に再利用する機能に包まれたものの、それは、Ranon(正直に偶然、)により溶液に似ています。

XSLTの解決策もありますが、まだXSLTを使用していない場合は、XQueryを使用するともっと理にかなっています。

HTH!

+0

ありがとうございます。それはカウンターロジックの理解に本当に役立ちました。ヘルプをよろしくお願いいたします。 – satsamsk

関連する問題