如何将选择字段的文本转换为图标?

时间:2012-12-14 23:50:53

标签: sharepoint xslt

Salve,伙计们!我的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 /> 但它似乎从来没有挂钩。该列绝对名为“Scope”。也许我只需要add the right mode

在萤火虫中,我可以看到该类永远不会添加。

[更新] 我注意到在我以这种方式使用模板的其他地方,模板永远不会“占用”,除非它定义了正确的mode。但是,我搜索了世界各地,找不到用于选择字段的mode权限。我甚至为 here创建了一个问题。此外,使用thisNode来自Microsoft's examples,您可以在其中轻松修改字段类型(此处此选项字段除外)。

2 个答案:

答案 0 :(得分:1)

要为mode属性的模板中的Custom Rendering字段定义SPFieldChoice,应使用值 body

未定义名称为Choice_body MultiChoice_body的模式的模板。

因此,在您的情况下,模板将如下所示:

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

未记录为呈现SharePoint字段定义的模板模式属性,但您可以在%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL\fldtypes.xsl中找到此信息。有关详细信息,请参阅模板 PrintField 的实现。

希望这有帮助,

瓦迪姆

答案 1 :(得分:0)

您编写模板的事实不足以执行此模板

如果选择执行XSLT内置(默认)模板的代码,则这些模板不知道任何名为$thisNode的参数,也不会将此参数传递给模板。

这意味着启动模板时$thisNode参数的值为空字符串 - 因此不满足xsl:when个测试条件,因此选择了xsl:otherwise

<强>解决方案

<强>要么

  1. 在代码中有一个明确的xsl:apply-templates,用于选择要与tempate匹配的节点,或者:

  2. 删除<xsl:param>,并在$thisNode出现.时将代码替换为代码。