概述和目標
外框, 苔蘚’ 內容查詢 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:與參數 名稱="價值" |
這已是非常有用的. 謝謝!
Aah… 這是因為我以不同的方式命名我的清單樣式並沒有意識到在 ContentQueryMain.xsl 中它會檢查"風格":
<xsl:當 test="@Style='NameOfMyStyle'">
它與重命名的工作. 🙂
它幾乎為我工作: 我設法輸出 </表> 正確地結束標記, 但起始標記是缺掉的. 看來測試 ="$CurPos = 1" 不會返回 true. 但是,為什麼?
偉大的職位. Paul 我做上面的事情. 我有一個查詢, 如何實現"總實際開支不可隨意的總和" 或兩個列的值的總和.
你做任何工作與創建自訂的 ContentQueryMain 和 ItemStyle xsl 檔了? 我問的原因是我不想擔心我自訂的樣式將被覆蓋任何補丁程式或升級. 你有例子嗎? 我試過 ContentQueryMain.xsl 完全相同的副本並將該新的自訂副本上載到樣式庫. 當在.webpart 的 MainXslLink 屬性中把這個 xsl 檔的引用, 我得到 401 未授權. 自訂 xsl 檔是已發佈的版本,每個人都有對它的讀存取權限.
精彩絕倫的帖子謝謝! 有了爭奪這現在的最後幾天.
你好, 這是一個真正有説明的帖子. 我把它所有的工作, 和也實行的邁克布朗的變化,所以將一組
裡面的桌子旁無論結果我作為 CQWB 的屬性中的組的參數選擇.
我也做了標題連結, 所以它很好地工作. 我仍然有一個問題, 雖然. 我按網站名稱分組結果. 在表格內, 它很好地組合它們, 它看起來不錯, 但它仍然是列印出所有的組
名稱(在我的例子中的網站名稱) 表的上方. 有誰知道如何擺脫這些?
謝謝,
葛列格 ·
好文章. 我設法給我的表的預設 Sharepoint 清單的外觀通過分析清單中的原始程式碼. 這裡是需要在 ItemStyle 中適合的主要 HTML 塊:
<表格寬度 ="100%" 類 ="ms listviewtable" 邊境 = 0 空隙 = 0 中 = 1 dir ="None">
<!–標題–>
<TR 類 ="ms viewheadertr" 底邊對齊 = 頂部>
<TH nowrap 範圍 ="col" 類 ="ms-vh2"><div 樣式 ="寬度:100%;位置:相對;左:0;返回頁首:0;">
<表樣式 ="寬度:100%;" CtxNum ="1" 高度 ="100%" 格 = 1 中 = 0 類 ="ms-unselectedtitle">
<TR>
<TD 寬度 ="100%" 類 ="ms vb" nowrap>
富有杜效價 ici
</TD>
<TD 樣式 ="位置:絕對;">
</TD>
</TR>
</表></div>
</TH>
<!–對於所有標頭儲存格重複–>
</TR>
<!– 表資料 –>
<TR 類 ="">
<!–資料列, 第一次與超連結使用 Paul 的代碼 –>
<TD 類 ="ms vb2">資料在這裡</TD>
<!–空列–>
<TD 類 ="ms vb2">
<大跨度 dir = 無></大跨度><
/TD>
<!–日期列–>
<TD 類 ="ms vb2">
<NOBR>11/12/2008</NOBR>
</TD>
</TR>
<!–***可選行 – 使用將插入基於模 2 的當前行的交替類的一個新的 XSL 變數–>
<TR 類 ="ms 交替">
…
</TR>
</表>
那就是加洲正是我一直在尋找......你搖滾的人......萬歲。愛你的職位。.
<xsl:應用範本選擇 ="。" 模式 ="itemstyle">
<xsl:與參數名稱 ="CurPos" 選擇 ="$CurPosition" />
<xsl:與參數名稱 ="最後一" 選擇 ="$LastRow" />
<xsl:與參數名稱 ="StartNewGroup" select="@__begingroup" />
</xsl:當>
<xsl:當測試 ="$StartNewGroup = True">
<tr>
<運輸署 >
<xsl:調用範本 name="OuterTemplate.GetGroupName">
<xsl:與參數名稱 ="組名" select="@*[名稱()$Group =]"/>
<xsl:與參數名稱 ="GroupType" 選擇 ="$GroupType"/>
</xsl:調用範本>
</運輸署>
</tr>
</xsl:當>
<xsl:否則>
</xsl:否則>
</xsl:選擇>
嗨保羅,
當使用 xml/xsl 和內容查詢 web 部件, 你找到好的方法來設置您的 xslt 的格式嗎? 試圖更改和設計的測試證明正確的疼痛的 * * 只使用一個文字編輯器…
所有最好的
(例如:. https://myweb.com/Marketing/images/icn-order.gif, )
我應該使用圖像或圖片在 CommonViewFields 欄位類型? (例如:. InternalColumnName, 圖像)
您的帖子正是我要找的東西. 不過, 我不能讓它工作.
我有各種文檔中存儲的文檔. 存儲庫,但分類使用自訂類列 (選擇: 1 或 2. 我想要使用 CQWP 來顯示這些檔基於他們班.
我是能夠添加 CQWP, 將其匯出到 SPD, 配置 itemStyle.xls 在清單視圖中顯示自訂領域. 然而, 我不能成功地執行你在這裡描述.
這些都是我想要在我的 CQWP 中顯示的列:
檔案類型 (顯示圖示)
檔標題
上次修改日期
由誰修改
簽出給
簽入注釋
目前在清單格式的結果. 它為檯面的格式如何更改.
謝謝.
Saji
抱歉,在我的名字不能確定 missspelling 在哪裡 ” 來自.