我正在使用Sharepoint中的listview,它具有以下结构。
<Rows>
<Row Employee='Marc1' Manager='John'/>
<Row Employee='Marc2' Manager='John'/>
<Row Employee='Marc3' Manager='John'/>
<Row Employee='Marc4' Manager='John'/>
<Row Employee='Marc5' Manager='John'/>
<Row Employee='Marc6' Manager='Bob'/>
<Row Employee='Marc7' Manager='Bob'/>
<Row Employee='Marc8' Manager='Bob'/>
...
</Rows>
我们的想法是在一个表行中打印3个员工列。当一个不同的经理到来时,我们会添加一个新行。它看起来应该是这样的。
<table>
<tr>
<td>Marc1</td>
<td>Marc2</td>
<td>Marc3</td>
</tr>
<tr>
<td>Marc4</td>
<td>Marc5</td>
</tr>
<tr>
<td>Marc6</td>
<td>Marc7</td>
<td>Marc8</td>
</tr>
</table>
到目前为止,我有以下代码,它在每个第3个元素后以及经理不同时为我提供了一个新行。
<xsl:template match='dsQueryResponse'>
<table align="center">
<tbody>
<xsl:apply-templates select='Rows/Row'/>
</tbody>
</table>
</xsl:template>
<xsl:template match='Row'>
<xsl:if test="(position() =1) or (position() mod 3) = 1">
<tr >
</tr>
</xsl:if>
<xsl:if test="preceding-sibling::Row[position()=1]/@Manager != @Manager">
<tr>
</tr>
</xsl:if>
.......
唯一的问题是,当因为管理器而添加新行时,count()会因为mod 3而失去效力。由于管理器中的更改,它将为Marc 6打印一个新行,现在作为mod 3的条件,满足马克7,它将再次打印一个新的线(我想避免)和表将打印这样。任何想法我怎么能实现这个目标?
<table>
<tr>
<td>Marc1</td>
<td>Marc2</td>
<td>Marc3</td>
</tr>
<tr>
<td>Marc4</td>
<td>Marc5</td>
</tr>
<tr>
<td>Marc6</td>
</tr>
<td>Marc7</td>
<td>Marc8</td>
</tr>
</table>
非常感谢!
答案 0 :(得分:0)
你不需要jQuery!?以下 XSLT(1.0)会生成所需的输出。
Row
@Manager
元素进行分组
Row
元素进行分组(例如1-3) print_row - 将Row
元素打印到HTML行中。
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/" name="group_by_manager">
<table>
<xsl:for-each select="//Rows/Row[not(@Manager=preceding::*/@Manager)]">
<xsl:variable name="foo" select="." />
<xsl:call-template name="group_by_pos">
<xsl:with-param name="cells" select="//Rows/Row[@Manager=$foo/@Manager]" />
</xsl:call-template>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template name="group_by_pos">
<xsl:param name="cells" />
<xsl:for-each select="$cells[position() mod 3 = 1]">
<xsl:variable name="start" select="((position()-1)*3)+1" />
<xsl:variable name="end" select="$start+2" />
<xsl:call-template name="print_row">
<xsl:with-param name="cells" select="$cells[position() >= $start and position() <= $end]" />
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="print_row">
<xsl:param name="cells" />
<tr>
<xsl:for-each select="$cells">
<td><xsl:value-of select="@Employee" /></td>
</xsl:for-each>
</tr>
</xsl:template>