1

電話番号を返す関数があります。この形式で返されます

<td>#phone</td>

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

XQuery の for ステートメント (キーワード at を含む 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 行のみを表示したい。次の行の残りのデータ。

4

3 に答える 3

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予期しないものになる可能性があります。$i4行目は必ず(1~10)と(0)を足す$sumのですが、更新はせず$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>

コードに合わせる必要があるかもしれませんが、アイデアは問題ないはずです。

編集: クエリ プロセッサがサポートしている場合は、スライディング ウィンドウを使用することもできます。バージョン 5.0.2 の時点では、Marklogic はまだそうではありません。

于 2012-01-06T11:13:41.150 に答える
0

これが役立つかもしれません、uは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>
于 2012-01-06T10:32:10.277 に答える
0

ステートメントの at キーワードは、FLWORここではあまり役に立ちません。一度に 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する方が理にかなっていると思います。

チッ!

于 2012-01-07T12:52:53.467 に答える