列表视图中的查找字段的自定义xsl呈现(SharePoint 2010)

Luc*_*Luc 5 xslt sharepoint sharepoint-2010

我正在尝试更改列表视图页面上列表列的呈现.

经过一些教程和一些头发拉动后,我设法为计算和货币字段创建了一个xslt(来自fldtypes_XXXXXX.xsl):

<xsl:template match ="FieldRef[@Name='MarkCalc']" mode="Text_body">
  <xsl:param name="thisNode" select="."/>
  <xsl:value-of select="$thisNode/@*[name()=current()/@Name]" disable-output-escaping ="yes"/>
</xsl:template>

<xsl:template match="FieldRef[@Name='CurrencyTest']" mode="Number_body">
  <xsl:param name="thisNode" select="."/>
  <b><xsl:value-of disable-output-escaping="yes" select="$thisNode/@*[name()=current()/@Name]" /></b>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

然后我尝试对查找字段执行相同操作,但它不起作用.这是我的最后一次尝试(我从SharePoint设计器复制它).我错过了什么?

<xsl:template match="FieldRef[(@Encoded) and @Name='Lookup1']" mode="Lookup_body">
  <xsl:param name="thisNode" select="."/>
  <b><xsl:value-of select="$thisNode/@*[name()=current()/@Name]" disable-output-escaping="yes" /></b>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

Luc*_*Luc 8

事实证明,这完全是xsl问题.

Xsl处理器根据"匹配"和"模式"属性选择要使用的模板.当两个或多个模板匹配时,将优先选择要使用的模板.默认情况下,根据匹配的具体方式分配三个级别的优先级.

来自http://www.codetoad.com/xml/xslt8.asp:

  • 匹配一类节点的模式(例如*,匹配所有元素)被赋予隐式优先级-0.5

  • 根据节点名称匹配节点的模式(如Character,与元素匹配)将被赋予隐式优先级0

  • 根据其上下文匹配节点的模式(例如CastMember/Character,与父元素为元素的元素匹配)被赋予隐式优先级0.5

在根据模式分配优先级时,上下文信息的具体程度并不重要:如果为节点指定任何上下文,则模板的优先级为0.5.例如,Description/Link/Character与Description // Character具有完全相同的优先级.

在SharePoint中,有两个用于查找字段的模板

<xsl:template name="FieldRef_Lookup_body" match="FieldRef" mode="Lookup_body" ddwrt:dvt_mode="body">...
Run Code Online (Sandbox Code Playgroud)

<xsl:template match="FieldRef[@Encoded]" mode="Lookup_body" ddwrt:dvt_mode="body">
Run Code Online (Sandbox Code Playgroud)

第一个优先级为0(根据其名称匹配),第二个优先级为0.5(根据上下文匹配).

我的自定义模板应该覆盖编码查找

<xsl:template match="FieldRef[(@Encoded) and @Name='Lookup1']" mode="Lookup_body">...
Run Code Online (Sandbox Code Playgroud)

默认优先级为0.5(记住,"......上下文信息的具体程度并不重要......"),因此xsl处理器选择最后一个定义的(*).

要解决此问题,您可以使用属性优先级并将其设置为高于默认模板的值.就我而言,我把它设置为1.

<xsl:template match="FieldRef[(@Encoded) and @Name='Lookup1']" priority="1" mode="Lookup_body">...
Run Code Online (Sandbox Code Playgroud)



(*)显然SharePoint 加载自己的模板之前加载自定义模板.这是基于某些技术标准的选择还是确保我学习xsl,仍然是个谜.