4

次のような構造の XML データセット (SharePoint 2007 から DVWP に提供される) があります。

<Rows>
  <Row ID="1" Spanoffset="0" Span="55" Spantail="55"/>
  <Row ID="2" Spanoffset="30" Span="31" Spantail="61"/>
  <Row ID="3" Spanoffset="61" Span="20" Spantail="81"/>
  <Row ID="4" Spanoffset="82" Span="30" Spantail="112"/>
</Rows>

各行が で始まり幅の広いバーを表している@Spanoffsetとします。必要に応じて計算する必要はありません。重複しない行がグループ化されるように、行を効率的にまとめようとしています。データセットは によって事前にソートされています。各行は複数の可能なグループに収まる可能性があるため、これは本質的にナップザックの問題です。私がやりたいのは単純な貪欲な解決策であり、たとえばC#やJavaでそれをコーディングする方法を知っていますが、ノードを訪問済みとしてマークすることはできません(まあできますが、再帰ツリーに戻ると失われます)ノードにアクセスしてもノードを削除できないようです。これにアプローチする方法がわかりません。@Span@Spantail@Spanoffset

たとえば、上記のデータは次のようになります。

<div style="clear:both">
  <div style="width: 110px; margin-left: 0px; float:left;">1</div>
  <div style="width: 40px; margin-left: 12px; float:left;">3</div>
  <div style="width: 60px; margin-left: 2px; float:left;">4</div>
</div>
<div style="clear:both">
  <div style="width: 62px; margin-left: 60px; float:left;">2</div>
</div>

Rowノードを正しい順序で 1 回だけしか表示できないので、フロートを正しく機能させることに苦労していません。それらを取得したら、フォーマットをうまく機能させることができるとかなり確信しています。

これまでに思いついた最高の XSLT は次のとおりです。

<xsl:template match="row">
  <xsl:variable name="tail" select="@Spantail"/>
  <div style="width:{2*@Span}px;
    left:{2*(@Spanoffset)}px;">
    <xsl:value-of select="@ID"/>
  </div>                        
  <xsl:apply-templates select="(following-sibling::row)[@Spanoffset>=$tail][1]"/>
</xsl:template>

生成するもの

<div style="width: 110px;left: 0px">1</div>
<div style="width: 40px; left: 122px">3</div>
<div style="width: 60px; left: 164px">4</div>
<div style="width: 62px; left: 60px">2</div>
<div style="width: 40px; left: 122px">3</div>
<div style="width: 60px; left: 164px">4</div>
<div style="width: 40px; left: 122px">3</div>
<div style="width: 60px; left: 164px">4</div>
<div style="width: 60px; left: 164px">4</div>

したがって、私の問題は 2 (私が見る) であり、それらは絡み合っていると思います。1) 各行を 1 回だけ出力するようにテンプレートを修正/リファクタリングする方法。<div>2) グループ化をコンテナ要素にラップする方法。

これに対して2日間頭を悩ませていましたが、誰か助けてくれますか?

編集:まあ、少し寝た後、テンプレートにブール値パラメーターを追加し、いくつかのCDATAタグを使用して<div>、trueの場合にタグを発行することにより、ラッピングコンテナーを作成しました。ブール値のデフォルトは true で、ネストされた apply-templates を呼び出すときに false に設定することで、グループをコンテナにまとめます。<Row>s を訪問済みとしてマークする方法がまだわかりません。

4

1 に答える 1