概述和目標
外框, 苔蘚’ 內容查詢 Web 組件 (CQWP) 其結果顯示在清單格式中, 類似于搜尋結果. 它也是可能以網格格式顯示結果 (e 小節. HTML 表的格式). 柵格格式是在某些情況下更好. 描述了如何實現這種效果在這篇文章.
業務應用場景
有在用戶端與企業級苔蘚推出. 我們已設計及其分類,例如,專案層次結構中的第一類公民,有他們自己的頂層網站. 專案經理保持單身人士清單專案的摘要資訊, 如標題, 預算, 預計的完工日期, 其餘的預算和其他摘要類型欄位. 由"單身" 我的意思是保證包含只有一個專案的自訂 SharePoint 清單. 簡單地, 它看起來像這樣:
技術方法是多描述的一樣 在這裡 (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). CQWP 使用 XSL 轉換來發出為瀏覽器的 HTML 呈現.
我總是設想結果前潛入 XSL,因為 XSL 是一場噩夢. 這裡是我期望的結果:
像這樣的 HTML 生成的結果:
|
<html>
<正文>
<中心>
<表 邊框= 1>
<!-- 標籤 — —>
<tr 背景色= 藍>
<運輸署><字體 顏色= 白色><b>專案名稱</b></字體></運輸署>
<運輸署 對齊= 正確><字體 顏色= 白色><b>完成日期</b></字體></運輸署>
<運輸署 對齊= 正確><字體 顏色= 白色><b>預算</b></字體></運輸署>
<運輸署 對齊= 正確><字體 顏色= 白色><b>實際費用</b></字體></運輸署>
<運輸署><字體 顏色= 白色><b>整體狀態</b></字體></運輸署>
</tr>
<tr>
<運輸署>重新連接電腦房.</運輸署>
<運輸署 對齊= 正確>02/01/08</運輸署>
<運輸署 對齊= 正確>22,500.00</運輸署>
<運輸署 對齊= 正確>19,000.00</運輸署>
<運輸署>在進展中</運輸署>
</tr>
<tr>
<運輸署>提供伺服器的 SQL 升級</運輸署>
<運輸署 對齊= 正確>04/01/08</運輸署>
<運輸署 對齊= 正確>7,500.00</運輸署>
<運輸署 對齊= 正確>0.00</運輸署>
<運輸署>計畫</運輸署>
</tr>
</表>
</中心>
</正文>
</html>
|
方法
按照這些步驟來創建網格:
- 確定網格的元件 (行/列).
- 定義並創建必要的網站列.
- 創建子網站,為專案和單身人士名單.
- 將 CQWP 添加到 web 頁並將其配置為搜索您的清單.
- 修改 CQWP 的 XML 來收集起來的額外的列.
- 修改 XSL 生成表.
我要去專注于數位六. 數位從一到四個是直向前和任何 CQWP 使用者已經做的東西. 五號已被證實的其他人包括詳盡螢幕截圖載貨的本文從 MSDN 在這裡 (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) 和希瑟 · 所羅門的博客 在這裡 (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).
螺栓和螺母
開始和執行步驟一到五的 MSDN 文檔和希瑟 · 所羅門條步驟.
在這一點, 向頁面添加了您的 CQWP 和你有你 <CommonViewFields> 根據需要配置.
按照通常的步驟, 拿到這些中間結果:
1. 創建內容類型, 該內容類型和兩個網站範本的自訂清單. 這裡是內容類型:
這裡是網站結構:
2. 創建我的專案的子網站和單身人士專案摘要清單後添加 CQWP:
3. 添加我想要通過的所有其他資訊 <CommonViewFields>:
<屬性 名稱="CommonViewFields" 類型="字串">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</屬性>
請注意,我不得不保持在一個線上或它的所有屬性欄位將不工作 (CQWP 會告訴我,該查詢返回任何專案).
4. 在這一點, 我們準備去超越 MSDN 文章翻到希瑟 · 所羅門的文章. 跟隨她的腳步開始近一步 #5 若要創建一個自訂 / 未託管的版本的 ItemStyle.xsl. 希瑟的聽從, 通過一步了 11 和得到這些中間結果:
4.1: 我的 XSL 範本的名稱,如下所示:
<xsl:範本名稱 ="網格" 匹配 ="行[@Style = 電網]" 模式 ="itemstyle">
她建議,我也略有修改 <xsl:為每個 …> 通過添加 <br /> 標記,以提供一個更清潔的清單:
<xsl:為每個 請選擇="@*">
P:<xsl:值的 請選擇="名稱()" /><br/>
</xsl:為每個>
4.2: 我修改的 web 部件, 轉到外觀並選擇我"網格" 樣式:
應用更改並在這裡是結果:
從上面我們可以看到我們希望田野 (專案名稱, 費用, 狀態, 等) 可供我們使用時我們發出的 HTML. 不只如此, 但我們看到,我們必須引用那些列在 XSL 中的名稱. 舉個例子, 我們引用專案的狀態作為"Project_x005F_x0020_Name".
在這一點, 我們離開從希瑟的博客,從這些巨人的肩膀上, 添加我自己一點點.
ContentQueryMain.xsl
請注意: 當對 ContentQueryMain.xsl 以及 ItemStyle.xsl 的更改, 您需要檢查那些檔回之前您看到您的更改的效果.
為網格製作目的, 苔蘚使用兩個不同的 XSL 檔來生成的結果我們看到從 CQWP. 生成輸出的前一位, 我們修改了 ItemStyle.xsl. 苔蘚實際上使用另一個 XSL 檔, ContentQueryMain.xsl 到 ItemStyle.xsl 來生成其 HTML 結合. 正如其名稱所暗示, ContentQueryMain.xsl 是"主" 控制整體液流的翻譯的 XSL. 它遍歷所有找到的項並將它們傳遞到範本逐一在 ItemStyle.xsl. 我們將修改 ItemStyle.xsl 生成開放 <表> 之前發射的第一行的資料並關閉標記 <表> 標記後發出的最後一行. 要做到這一點, ContentQueryMain.xsl 被修改,以將兩個參數傳遞給我們"網格" ItemStyle.xsl 中的範本, "最後一行" 和"當前行". ItemStyle.xsl 使用這些有條件地發出必要的標記.
使用希瑟 · 所羅門的技術, 我們找到 ContentQueryMain.xsl. 它坐落在 ItemStyle.xsl 一樣的地方. 此螢幕擷取畫面應該説明:
我們需要進行以下更改:
- 修改 xsl 範本, "CallItemTemplate" 這實際上調用我們在 ItemStyle.xsl 的網格範本. 我們將到網格範本傳遞兩個參數,以便它會有這些資料,它需要有條件地生成打開和關閉 <表> 標籤.
- 另一位叫"CallItemTemplate 的 ContentQueryMain.xsl 的修改" 把它傳遞"LastRow" 因此,LastRow 可能會轉嫁到我們的網格範本的參數.
找到名為"OuterTemplate.CallItemTemplate 的範本" 由字串標識:
<xsl:範本 名稱="OuterTemplate.CallItemTemplate">
替換整個範本,如下所示:
|
<xsl:範本 名稱="OuterTemplate.CallItemTemplate">
<xsl:param 名稱="CurPosition" />
<!--
添加"LastRow" 參數.
我們只使用它時專案風格通行證中的"網格".
-->
<xsl:param 名稱="LastRow" />
<xsl:選擇>
<xsl:當 測試="@Style = 'NewsRollUpItem'">
<xsl:應用範本 請選擇="." 模式="itemstyle">
<xsl:與參數 名稱="編輯模式" 請選擇="$cbq_iseditmode" />
</xsl:應用範本>
</xsl:當>
<xsl:當 測試="@Style = 'NewsBigItem'">
<xsl:應用範本 請選擇="." 模式="itemstyle">
<xsl:與參數 名稱="CurPos" 請選擇="$CurPosition" />
</xsl:應用範本>
</xsl:當>
<xsl:當 測試="@Style = 'NewsCategoryItem'">
<xsl:應用範本 請選擇="." 模式="itemstyle">
<xsl:與參數 名稱="CurPos" 請選擇="$CurPosition" />
</xsl:應用範本>
</xsl:當>
<!--
將當前的位置和 lastrow 傳遞給網格 itemstyle.xsl 範本.
ItemStyle.xsl 將會使用,發出打開和關閉 <表> 標籤.
-->
<xsl:當 測試="@Style = 電網">
<xsl:應用範本 請選擇="." 模式="itemstyle">
<xsl:與參數 名稱="CurPos" 請選擇="$CurPosition" />
<xsl:與參數 名稱="最後" 請選擇="$LastRow" />
</xsl:應用範本>
</xsl:當>
<xsl:否則>
<xsl:應用範本 請選擇="." 模式="itemstyle">
</xsl:應用範本>
</xsl:否則>
</xsl:選擇>
</xsl:範本>
|
評論描述所做的更改的目的.
答案是肯定的, "OuterTemplate.CallItemTemplate" 本身是從另一個範本調用嗎. 通過搜索此文本字串查找該範本:
<xsl:範本 名稱="OuterTemplate.Body">
滾動流覽 OuterTemplate.Body 中的說明並插入 LastRow 參數,如下所示 (顯示為斜體的注釋):
<xsl:調用範本 名稱="OuterTemplate.CallItemTemplate">
<xsl:與參數 名稱="CurPosition" 請選擇="$CurPosition" />
<!-- 插入 LastRow 參數. -->
<xsl:與參數 名稱="LastRow" 請選擇="$LastRow"/>
</xsl:調用範本>
所有這一切之後, 我們終於有了正確設置,我們 ItemStyle.xsl 可以發出的東西 <表> 在正確的地點標記.
ItemStyle.Xsl
請注意: 再次, 在 ItemStyle.xsl 中進行任何更改,所以,你看到那些更改的效果後檢查.
在這裡,我們有兩個任務:
- 替換整個網格範本. 你可以複製/粘貼從下面.
- 添加一些胡言亂語外範本定義,使"formatcurrency" 要工作範本. (你可以告訴我有一個纖細的控制碼在 XSL).
第一次, 靠近頂部的 ItemStyle.xsl, 添加這條線:
<!-- 一些胡言亂語,使我們能夠顯示美國. 貨幣. -->
<xsl:十進位格式 名稱="工作人員" 數位="D" />
<xsl:範本 名稱="預設值" 比賽="*" 模式="itemstyle">
注意直接之前將其添加 <xsl:範本名稱 ="預設" …> 定義.
下一次, 回到我們的網格範本. 用下面的代碼替換整個網格範本. 它是徹底的評論, 但不要猶豫給我發電子郵件或在我的博客留下評論,如果你有問題.
|
<xsl:範本 名稱="網格" 比賽="行[@Style = 電網]" 模式="itemstyle">
<!--
ContentMain.xsl 通過 CurPos 和最後.
我們用這些來有條件地發出打開和關閉 <表> 標籤.
-->
<xsl:param 名稱="CurPos" />
<xsl:param 名稱="最後" />
<!-- 以下變數都是從標準 ItemStyle.xsl 中未被修改 -->
<xsl:變數 名稱="SafeImageUrl">
<xsl:調用範本 名稱="OuterTemplate.GetSafeStaticUrl">
<xsl:與參數 名稱="UrlColumnName" 請選擇="'' ImageUrl"/>
</xsl:調用範本>
</xsl:變數>
<xsl:變數 名稱="SafeLinkUrl">
<xsl:調用範本 名稱="OuterTemplate.GetSafeLink">
<xsl:與參數 名稱="UrlColumnName" 請選擇="'' LinkUrl"/>
</xsl:調用範本>
</xsl:變數>
<xsl:變數 名稱="DisplayTitle">
<xsl:調用範本 名稱="OuterTemplate.GetTitle">
<xsl:與參數 名稱="標題" 請選擇="@Title"/>
<xsl:與參數 名稱="UrlColumnName" 請選擇="'' LinkUrl"/>
</xsl:調用範本>
</xsl:變數>
<xsl:變數 名稱="LinkTarget">
<xsl:如果 測試="@OpenInNewWindow = true" >_blank</xsl:如果>
</xsl:變數>
<!--
在這裡我們定義一個變數, ""tableStart. 這包含的 HTML,我們使用來定義表的列標籤開幕. 請注意,如果 CurPos = 1, 它包括 HTML 在 CDATA 標記.
否則, 它將為空.
TableStart 的值是一大,每次通過 ContentQueryMain.xsl 調用 ItemStyle 時.
-->
<xsl:變數 名稱="tableStart">
<xsl:如果 測試="$CurPos = 1">
<![CDATA[
<表格邊框 = 1>
<tr 背景色 ="藍色">
<運輸署><字體顏色 ="白"><b>專案名稱</b></字體></運輸署>
<運輸署對齊 ="權利"><字體顏色 ="白"><b>完成日期</b></字體></運輸署>
<運輸署對齊 ="權利"><字體顏色 ="白"><b>預算</b></字體></運輸署>
<運輸署對齊 ="權利"><字體顏色 ="白"><b>實際費用</b></字體></運輸署>
<運輸署><字體顏色 ="白"><b>整體狀態</b></字體></運輸署>
</tr>
]]>
</xsl:如果>
</xsl:變數>
<!--
另一個變數, tableEnd 只是定義關閉表標記.
與 tableStart 一樣, 它始終是一大. 這就是為什麼它的值分配有條件地根據是否我們被路過的最後一行 ContentQueryMain.xsl.
-->
<xsl:變數 名稱="tableEnd">
<xsl:如果 測試="$CurPos = $Last">
<![CDATA[ </表> ]]>
</xsl:如果>
</xsl:變數>
<!--
總是發出 tableStart 的內容. 如果這不是通過 ContentQueryMain.xsl 傳遞給我們的第一行, 然後我們知道它的值將顯示為空白.
禁用輸出轉義因為當 tableStart 不空白, 它包括我們要由瀏覽器呈現的實際 HTML. 如果我們不告訴 XSL 解析器來禁用輸出轉義, 它將生成之類"&這是;表>" 而不是"<表>".
-->
<xsl:值的 請選擇="$tableStart" 禁用輸出轉義="是"/>
<tr>
<!--
P:Project_x005F_x0020_Name P:Project_x005F_x0020_End_x005F_x0020_Date P:Project_x005F_x0020_Budget P:Project_x005F_x0020_Expenses P:Project_x005F_x0020_Status
-->
<運輸署>
<xsl:值的 請選擇="@Project_x005F_x0020_Name"/>
</運輸署>
<運輸署 對齊="權利">
<xsl:值的 請選擇="@Project_x005F_x0020_End_x005F_x0020_Date"/>
</運輸署>
<運輸署 對齊="權利">
<xsl:調用範本 名稱="formatcurrency">
<xsl:與參數 名稱="價值" 請選擇="@Project_x005F_x0020_Budget"></xsl:與參數>
</xsl:調用範本>
</運輸署>
<運輸署 對齊="權利">
<xsl:調用範本 名稱="formatcurrency">
<xsl:與參數 名稱="價值" 請選擇="@Project_x005F_x0020_Expenses"> </xsl:與參數>
</xsl:調用範本>
</運輸署>
<運輸署>
<xsl:值的 請選擇="@Project_x005F_x0020_Status"/>
</運輸署>
<!--
滿足以下所有條件被注釋掉,以澄清事情.
不過, 把它帶回來,塞進 <運輸署> 看看它的效果.
-->
<!--
<div id ="linkitem" 類 ="專案">
<xsl:如果測試 ="字串長度($SafeImageUrl) != 0">
<div 類 ="圖像-地區-左">
<href ="{$SafeLinkUrl}" 目標 ="{$LinkTarget}">
<img 類 ="圖像-固定寬度" src ="{$SafeImageUrl}" alt ="{@ImageUrlAltText}"/>
</一>
</div>
</xsl:如果>
<div 類 ="連結">
<xsl:調用範本 name="OuterTemplate.CallPresenceStatusIconTemplate"/>
<href ="{$SafeLinkUrl}" 目標 ="{$LinkTarget}" 標題 ="{@LinkToolTip}">
<xsl:值的選擇 ="$DisplayTitle"/>
</一>
<div 類 ="說明">
<xsl:值的 select="@Description" />
</div>
</div>
</div>
-->
</tr>
<!--
發出關閉表標記. 如果我們不是在最後一行,
這將顯示為空白.
-->
<xsl:值的 請選擇="$tableEnd" 禁用輸出轉義="是"/>
</xsl:範本>
<xsl:範本 名稱="formatcurrency">
<xsl:param 名稱="價值" 請選擇="0" />
<xsl:值的 請選擇='數位格式($價值, "$DDD,DDD,DDD。DD", "工作人員")' />
</xsl:範本>
|