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)
事实证明,这完全是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,仍然是个谜.