【问题标题】:How to convert text of choice fields into icons?如何将选择字段的文本转换为图标?
【发布时间】:2012-12-14 23:50:52
【问题描述】:

救命,伙计们!我的共享点页面中有一个选择字段,其中包含如下选项:

(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,并且还尝试添加 &lt;xsl:apply-templates /&gt; 但它似乎从来没有上钩过。该列明确命名为“范围”。也许我只需要add the right mode

在萤火虫中,我可以看到从未添加过该类。

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

【问题讨论】:

  • BGM,您编写了一个模板这一事实还不足以让这个模板永远被执行。如果它被 XSLT 内置(默认)模板的代码选择执行,这些模板不知道任何名为 $thisNode 的参数,并且不会将此类参数传递给您的模板。这意味着启动模板时参数的值是空字符串——因此xsl:when测试条件都不满足,因此选择xsl:otherwise

标签: sharepoint xslt


【解决方案1】:

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

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

所以,在你的情况下,template 看起来像这样:

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

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

希望这会有所帮助,

瓦迪姆

【讨论】:

【解决方案2】:

您编写了一个模板并不足以让该模板永远执行

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

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

解决方案

任一

  1. 在您的代码中有一个显式的xsl:apply-templates,用于选择要与模板匹配的节点,或者:

  2. 删除&lt;xsl:param&gt;,并将代码中出现的$thisNode替换为.

【讨论】:

  • 但是我有三个非常相似的模板,它们可以很好地将文本字段转换为超链接。唯一的区别是choose。我想我还是有点困惑。
  • 我在_layouts/XSL中有一个名为fldtypes_custom.xsl的xsl文件,由Sharepoint自动加载。
  • @BGM,除非您提供完整的源 XML 文档和完整的 XSLT 转换,否则人们只能猜测可能出现的问题——它在您拥有的 XML 文档和 XSLT 代码中没有向我们展示。此外,XSLT 专家不太可能知道 Sharepoint 的工作原理,同样,SharePoint 专家很可能对 XSLT 没有太深的了解。如果你想证明模板曾经被执行过,让它输出一些不同的东西——比如“XXXXXXXXX”。然后,如果您在输出中看到此字符串,则表示模板已执行。
  • 我没有源 XML 文档(或者不知道如何获取它) - 我只是在我的自定义 XSLT 文件中添加一个条目来修改共享点列表。我确实用sharepointxslt 标记了这个问题 - 我不知道要提供什么其他信息,Dimitre。不过,我会为您发布 xslt 文件的其余部分,但我认为这不会有任何帮助。
  • @BGM,您可以使用以下命令输出源 XML 文档:`。执行此操作时,请复制结果并将其粘贴到您的问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2015-03-22
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
相关资源
最近更新 更多