我正在使用SharePoint內容查詢Web部件。我有需要的HTML輸出爲修改XSLT中的屬性值並再次調用模板
<ul>
<li>
<img src="{RowAttribute-Url}" />
</li>
<li>
<img src="{RowAttribute-Url}" />
</li>
</ul>
<table>
<tr>
<td>{RowAttribute-Title}</td>
<td>{RowAttribute-Title}</td>
</tr>
</table>
,爲CQWP輸入XML是
<dsQueryResponse>
<Rows>
<Row ID="1" Title="Jane Doe" Modified="2010-10-14 14:05:14" Author="" Editor="" Created="2010-10-14 11:50:35" ArticleStartDate="2010-10-01 00:00:00" Style="OutputTemplateName" GroupStyle="DefaultHeader" __begincolumn="True" __begingroup="False"></Row>
<Row ID="2" Title="John Doe" Modified="2010-10-14 14:05:29" Author="" Editor="" Created="2010-10-14 13:17:10" ArticleStartDate="2010-10-01 00:00:00" Style="OutputTemplateName" GroupStyle="DefaultHeader" __begincolumn="False" __begingroup="False"></Row>
</Rows>
</dsQueryResponse>
所以你可以看到,Web部件將「告訴」 XSLT,它應該呈現一個特定的樣式或輸出模板。我想在行上重新運行第二個模板,我認爲最簡單的方法是在第一次運行後替換style屬性。
第一次運行我想爲每一行渲染一系列li標籤,第二遍經過我想要做trs。
是否有可能在再次調用ItemStyle模板之前使用xsl-copy替換「OutputTemplateName」?
這裏是外和內樣式表的XSLT(內作爲itemstyles)
<xsl:template name="OuterTemplate">
<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row" />
<xsl:variable name="RowCount" select="count($Rows)" />
<xsl:variable name="IsEmpty" select="$RowCount = 0" />
<div id="container">
<div id="inner-container">
<xsl:choose>
<xsl:when test="$IsEmpty">
<xsl:call-template name="OuterTemplate.Empty" >
<xsl:with-param name="EditMode" select="$cbq_iseditmode" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="OuterTemplate.Body">
<xsl:with-param name="Rows" select="$Rows" />
<xsl:with-param name="FirstRow" select="1" />
<xsl:with-param name="LastRow" select="$RowCount" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</div>
</div>
</xsl:template>
<xsl:template name="OuterTemplate.Body">
<xsl:param name="Rows" />
<xsl:param name="FirstRow" />
<xsl:param name="LastRow" />
<div id="container-rotator">
<ul>
<xsl:for-each select="$Rows">
<xsl:variable name="CurPosition" select="position()" />
<xsl:if test="($CurPosition >= $FirstRow and $CurPosition <= $LastRow)">
<xsl:call-template name="OuterTemplate.CallItemTemplate">
<xsl:with-param name="CurPosition" select="$CurPosition" />
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</ul>
</div>
<h5>
<xsl:value-of select="ddwrt:FormatDateTime(string(/dsQueryResponse/Rows/Row[1]/@ArticleStartDate), 1033, 'MMMM')"/></h5>
<table>
<!-- before calling this foreach.. would i do the copy? -->
<xsl:for-each select="$Rows">
<xsl:variable name="CurPosition" select="position()" />
<xsl:if test="($CurPosition >= $FirstRow and $CurPosition <= $LastRow)">
<xsl:call-template name="OuterTemplate.CallItemTemplate">
<xsl:with-param name="CurPosition" select="$CurPosition" />
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</table>
<div>
<a title="" href="/sites/sitename/Pages/page.aspx" target="">A Page Link</a>
</div>
<div>
<a href="#">Another Page</a>
</div>
</xsl:template>
而那麼項目模板低於這是我想幾乎複製,而是使用TRS,並且還提供了新的「風格」
<xsl:template name="OutputTemplateName" match="Row[@Style='OutputTemplateName']" mode="itemstyle">
<xsl:param name="CurPos" />
<xsl:choose>
<xsl:when test="$CurPos = 1">
<li class="show">
<img src="{$SafeImageUrl}" />
</li>
</xsl:when>
<xsl:otherwise>
<li>
<img src="{$SafeImageUrl}" />
</li>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
所以模板,總的來說,我有一系列的行,我我想先放入一個無序列表,然後再放入一個表格......所有這些都以HTML格式輸出,但我只能將它發送到一個外部變換中。
即使任何概念性建議都會有所幫助。我會繼續更新這篇文章,因爲我發現更多。
下面我用的接受的答案做以下**
使用回答以下我將闡述需要上述的變化。
在主包裝xslt我做了以下。
<xsl:template name="OuterTemplate.CallItemTemplate">
<xsl:param name="CurPosition" />
<xsl:param name="Mode" />
<xsl:choose>
<xsl:when test="$Mode = 'table'">
<xsl:apply-templates select="." mode="table">
<xsl:with-param name="CurPos" select="$CurPosition" />
</xsl:apply-templates>
</xsl:when>
<xsl:when test="$Mode = 'listitem'">
<xsl:apply-templates select="." mode="listitem">
<xsl:with-param name="CurPos" select="$CurPosition" />
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="." mode="itemstyle">
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
然後我有兩個項目模板,而不是一個。
<xsl:template name="TemplateNameList" match="Row[@Style='TemplateName']" mode="listitem">
<xsl:param name="CurPos" />
<xsl:variable name="SafeImageUrl">
<xsl:call-template name="OuterTemplate.GetSafeStaticUrl">
<xsl:with-param name="UrlColumnName" select="'ImageUrl'"/>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="$CurPos = 1">
<li class="show">
<img src="{$SafeImageUrl}" />
</li>
</xsl:when>
<xsl:otherwise>
<li>
<img src="{$SafeImageUrl}" />
</li>
</xsl:otherwise>
</xsl:choose>
尚不清楚你想要什麼。請提供要應用轉換的源XML文檔。另外,對於這個完全XML文檔提供了轉換所需的結果。最後,描述轉換的所需屬性。 – 2010-10-14 22:44:50
當然,我會看看我能做些什麼 – 2010-10-14 22:50:36
只是未成年人。我已經看到你的模式編輯。我認爲這並沒有幫助你減少樣式表邏輯。這一定是因爲那些名爲模板...我認爲你的樣式表需要重構更多的模式匹配...另外,混合數據和樣式信息並不是一個好的做法:你可以將該樣式信息放入佈局文檔中,然後填充該文件與數據。 – 2010-10-15 22:29:52