XSLT如何控制

时间:2014-07-28 12:56:34

标签: html xslt sharepoint

我正在使用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>

非常感谢!

1 个答案:

答案 0 :(得分:0)

你不需要jQuery!?以下 XSLT(1.0)会生成所需的输出。

  • group_by_manager - 按唯一Row
  • @Manager元素进行分组
  • group_by_position - 按位置对(子分组的)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() &gt;= $start and position() &lt;= $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>