2012-12-14 52 views
2

藥膏,夥計們!我在我的SharePoint頁面選擇現場,像這樣的選擇:如何將選擇字段的文本轉換爲圖標?

(1) Go 
(2) Warning 
(3) Stop 

現在,我想,要在列表中顯示爲圖標代替文本。我有一個可用的jquery腳本,但需要很長時間才能搜索包含文本的所有列表,並且最好使用xsl,因爲它在顯示之前呈現。

那麼我該如何在xsl中完成這項工作呢?這是據我已經得到了,因爲我只是學習的xsl:

<xsl:stylesheet 
    xmlns:x="http://www.w3.org/2001/XMLSchema" 
    xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" 
    version="1.0" 
    exclude-result-prefixes="xsl msxsl ddwrt" 
    xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" 
    xmlns:asp="http://schemas.microsoft.com/ASPNET/20" 
    xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:SharePoint="Microsoft.SharePoint.WebControls" 
    xmlns:ddwrt2="urn:frontpage:internal"> 

    <!-- Convert the Scope Field into an icon --> 
    <xsl:template match="FieldRef[@Name='Scope']"> 
     <xsl:param name="thisNode" select="."/> 
     <xsl:choose> 
      <xsl:when test="$thisNode/@Scope='(1) Go'"> 
       <td class="statusRating1"></td> 
      </xsl:when> 
      <xsl:when test="$thisNode/@Scope='(2) Warning'"> 
       <td class="statusRating2"></td> 
      </xsl:when> 
      <xsl:when test="$thisNode/@Scope='(3) Stop'"> 
       <td class="statusRating3"></td> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$thisNode/@Scope" /> 
      </xsl:otherwise>     
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

這裏是我想申請的CSS:

.statusRating1{background-image: url("/_layouts/custom/images/go.png"); } 
.statusRating2{background-image: url("/_layouts/custom/images/warning.png"); } 
.statusRating3{background-image: url("/_layouts/custom/images/stop.png"); } 

現在,我已經有和沒有mode="Choice_body"試過這種或mode="MultiChoice_body甚至Text_body,並且也嘗試添加<xsl:apply-templates /> ,但它似乎從來沒有像鉤。該列絕對命名爲「範圍」。也許我只需要add the right mode

在螢火蟲,我可以看到,類永遠不會被添加。

[更新]我注意到,在我使用這種方式的模板,除非它有定義的正確mode模板從來沒有「花」等地。不過,我已經搜遍了世界,找不到合適的mode用於選擇字段。我甚至爲創建了一個問題,即,here。此外,thisNode的使用是從Microsoft's examples,您可以非常容易地修改字段類型(除了在這裏這個選擇字段的情況下)。

+0

BGM,你已經寫了一個模板,這一事實是不夠的,這個模板永遠被執行。如果通過XSLT內置(默認)模板的代碼選擇執行它們,則這些模板不知道名爲'$ thisNode'的任何參數,並且不會將此參數傳遞給您的模板。這意味着模板啓動時參數的值是空字符串 - 因此沒有滿足'xsl:when'測試條件,因此選擇'xsl:otherwise'。 –

回答

1

爲了在模板來定義Custom Rendering用於SPFieldChoice字段爲mode屬性應該被使用的值

模板用於與名稱Choice_bodyMultiChoice_body模式沒有限定。

所以,你的情況模板是這樣的:渲染的SharePoint場沒有記錄定義

<xsl:template match="FieldRef[@Name='Scope']" mode="body"> 

模板模式屬性,但你會發現在%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL\fldtypes.xsl此信息。有關詳細信息,請參閱模板PrintField的實現。

希望這有助於

瓦迪姆

+0

啊,你抓到了我的兩個帖子!謝謝! (其他更詳細的帖子:http://sharepoint.stackexchange。COM /問題/ 54081 /什麼,是最XSLT模式結合換一個選擇題場/ 54672#54672) – bgmCoder

0

事實上,你寫了一個模板是不夠的,這個模板永遠不會被執行

如果通過XSLT內置(默認)模板的代碼選擇執行它們,則這些模板不知道名爲$thisNode的任何參數,並且不會將此參數傳遞給您的模板。

這意味着,當所述模板被啓動的所述$thisNode參數的值是空字符串 - 因此沒有一個xsl:when測試條件得到滿足,因此xsl:otherwise被選擇。

解決方案

要麼

  1. 在代碼中明確xsl:apply-templates,即選擇的節點由tempate匹配,或者:

  2. 刪除<xsl:param>,並在代碼中用.代替$thisNode的每次發生。

+0

但我有三個非常相似的模板,可以很好地將文本字段轉換爲超鏈接。唯一的區別是'選擇'。我想我還是有點困惑。 – bgmCoder

+0

我在'_layouts/XSL'中有一個名爲'fldtypes_custom.xsl'的xsl文件,它由Sharepoint自動加載。 – bgmCoder

+0

@BGM,除非您提供完整的源XML文檔和完整的XSLT轉換,否則人們僅限於猜測什麼可能是錯誤的 - 它在您未向我們顯示的XML文檔和XSLT代碼中。另外,XSLT專家不太可能知道Sharepoint是如何工作的,同樣,SharePoint專家很可能不太瞭解XSLT。如果您想要證明模板已經執行過,請輸出不同的內容 - 例如「XXXXXXXXX」。然後,如果您在輸出中看到此字符串,則意味着模板已執行。 –

相關問題