次のような構造の 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 を訪問済みとしてマークする方法がまだわかりません。