Scenario:
I have used Content Query Webpart and everytime I learn something but this time I think I found a BUG as OOTB xslt files available with Content Query does not support Header and Footer in fully controlled manner.
Solution:
I have re-adjusted few templates to make it easier for any one to edit.Even though I am dumping here all the changed templates , you can skip all these steps by simple downloading the updated file
ContentQueryMain.xsl for 2007 <- DOWNLOAD (free)
ContentQueryMain.xsl for 2010 <- DOWNLOAD (free, please rename file to ContentQueryMain before Use)
This updated version of ContentQueryMain.xsl supports Header , GroupHeader , GroupFooter and Footer templates.
Output will be something like this :
Code:
<xsl:template name="OuterTemplate.Body">
<xsl:param name="Rows" />
<xsl:param name="FirstRow" />
<xsl:param name="LastRow" />
<xsl:variable name="BeginColumn1" select="string('<td id="column" width="')" />
<xsl:variable name="BeginColumn2" select="string('%" valign="top">')" />
<xsl:variable name="BeginColumn" select="concat($BeginColumn1, $cbq_columnwidth, $BeginColumn2)" />
<xsl:variable name="EndColumn" select="string('</td >')" />
<xsl:for-each select="$Rows">
<xsl:variable name="CurPosition" select="position()" />
<xsl:if test="($CurPosition >= $FirstRow and $CurPosition <= $LastRow)">
<xsl:variable name="StartNewGroup" select="@__begingroup = 'True'" />
<xsl:variable name="StartNewColumn" select="@__begincolumn = 'True'" />
<xsl:choose>
<xsl:when test="$cbq_isgrouping != 'True'">
<xsl:if test="$CurPosition = $FirstRow">
<xsl:value-of disable-output-escaping="yes" select="$BeginColumn" />
<!-- New call to the Header template-->
<xsl:call-template name="OuterTemplate.CallHeaderTemplate"/>
</xsl:if>
</xsl:when>
<xsl:when test="$StartNewGroup and $StartNewColumn">
<xsl:choose>
<xsl:when test="$CurPosition = $FirstRow">
<xsl:value-of disable-output-escaping="yes" select="$BeginColumn" />
<!-- New call to the Header template-->
<xsl:call-template name="OuterTemplate.CallHeaderTemplate"/>
<!-- Renamed the existing Header template to group header template -->
<xsl:call-template name="OuterTemplate.CallGroupHeaderTemplate"/>
</xsl:when>
<xsl:otherwise>
<!-- Renamed the existing Footer template to group footer template -->
<xsl:call-template name="OuterTemplate.CallGroupFooterTemplate"/>
<!-- New call to the Footer template-->
<xsl:call-template name="OuterTemplate.CallFooterTemplate"/>
<xsl:value-of disable-output-escaping="yes" select="concat($EndColumn, $BeginColumn)" />
<xsl:call-template name="OuterTemplate.CallHeaderTemplate"/>
<!-- Renamed the existing Header template to group header template -->
<xsl:call-template name="OuterTemplate.CallGroupHeaderTemplate"/>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="$StartNewGroup">
<!-- Renamed the existing Footer template to group footer template -->
<xsl:call-template name="OuterTemplate.CallGroupFooterTemplate"/>
<!-- Renamed the existing Header template to group header template -->
<xsl:call-template name="OuterTemplate.CallGroupHeaderTemplate"/>
</xsl:when>
<xsl:when test="$StartNewColumn">
<xsl:choose>
<xsl:when test="$CurPosition = $FirstRow">
<xsl:value-of disable-output-escaping="yes" select="$BeginColumn" />
<!-- New call to the Header template-->
<xsl:call-template name="OuterTemplate.CallHeaderTemplate"/>
</xsl:when>
<xsl:otherwise>
<!-- New call to the Footer template-->
<xsl:call-template name="OuterTemplate.CallFooterTemplate"/>
<xsl:value-of disable-output-escaping="yes" select="concat($EndColumn, $BeginColumn)" />
<xsl:call-template name="OuterTemplate.CallHeaderTemplate"/>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="OuterTemplate.CallItemTemplate">
<xsl:with-param name="CurPosition" select="$CurPosition" />
</xsl:call-template>
<xsl:if test="$CurPosition = $LastRow">
<!-- Added an additional check to render the group footer only if grouping is enabled : start -->
<xsl:if test ="$cbq_isgrouping = 'True'" >
<!-- Renamed the existing Footer template to group footer template -->
<xsl:call-template name="OuterTemplate.CallGroupFooterTemplate"/>
</xsl:if>
<!-- Added an additional check to render the group footer only if grouping is enabled : end -->
<!-- New call to the Footer template-->
<xsl:call-template name="OuterTemplate.CallFooterTemplate"/>
<xsl:value-of disable-output-escaping="yes" select="$EndColumn" />
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:template>
<!-- Added a new template for Header -->
<xsl:template name="OuterTemplate.CallHeaderTemplate">
<!-- Wrapper div : start ( See CallFooterTemplate for closing node tag )-->
<xsl:variable name="test" select="string('<div id="test">')" />
<xsl:value-of disable-output-escaping="yes" select="$test" />
<div id="mainHeader">Main Header ( Locate me in ContentQueryMain.xsl file to change me )</div>
</xsl:template>
<!-- Renamed template , was originally names as CallHeaderTemplate -->
<xsl:template name="OuterTemplate.CallGroupHeaderTemplate">
<div id="header">Group Header ( Locate me in ContentQueryMain.xsl file to change me )</div>
<xsl:apply-templates select="." mode="header">
</xsl:apply-templates>
</xsl:template>
<!-- Renamed template , was originally names as CallFooterTemplate -->
<xsl:template name="OuterTemplate.CallGroupFooterTemplate">
<div id="footer">Group Footer ( Locate me in ContentQueryMain.xsl file to change me )</div>
</xsl:template>
<!-- Added a new template for Footer -->
<xsl:template name="OuterTemplate.CallFooterTemplate">
<div id="mainFooter">Main Footer ( Locate me in ContentQueryMain.xsl file to change me )</div>
<!-- Wrapper div : end ( See CallHeaderTemplate for starting node tag)-->
<xsl:variable name="test" select="string('</div> ')" />
<xsl:value-of disable-output-escaping="yes" select="$test" />
</xsl:template>
8 comments:
GREAT POST! :-)
Great Job
Good Job...
Excellent! Thank you!
Hi
Good post. I had mixed results with this. added it to my existing
ContentQueryMain.xls. I noticed that although the place holders are there, I still need to a bit of work to get them populated with actual header I am using. In my case I used the default banded header style but added extra code to create tabular list view for start of each group. I can send you the final xslt for your comments if you like.
sure , it will help some else save some time :)
Nice!! Thanks
Post a Comment