设为首页 收藏本站
查看: 684|回复: 0

[经验分享] SharePoint内容定制之XSLT高级用法——带返回值的函数调用

[复制链接]

尚未签到

发表于 2015-9-25 05:49:20 | 显示全部楼层 |阅读模式
  前言:通常大家使用XSLT仅仅是用它进行简单的数据展示,但是如果涉及到复杂的逻辑处理,便变得无从下手。其实,在XSLT本身支持JavaScript, C#等语言自定义函数,只可惜SharePoint无情的把这一特性给屏蔽了。所以为了更多的实现的功能,我们不得不挖掘xsl:template的一些特殊用途——带返回值的函数调用,让它具备别的编程语言所拥有的灵活性。
  
  xsl:template本身不是一个函数,在多数情况下,它只是作为一个内容输出的模块化工具,但是借助xsl:variable标签,我们可获取到xsl:template输出的内容,对其进行相关操作,从而实现带返回值的函数调用模拟,在此基础上完成更复杂的逻辑处理,弥补了SharePoint中不支持XSLT自定义函数的不足。同时,那些由于XSLT变量不能进行动态赋值所带来的问题亦可迎刃而解。详情请参看以下示例。
  
  
  一.对字符串进行简单处理。
  目标:从Lookup字段类型中提取标题信息。(注:Lookup字段类型的值格式为“ItemId;#ItemTitle”,例如:“2;#Hello, world”,所以在这里我们需要提取出“Hello, world”这一部分的值)
  
  1.  定义template作为“函数”。



<xsl:template name="ExtractUrl">
<xsl:param name="input"/>
<!- 截取“;#”后面的字符串 -->
<xsl:value-of select="substring-after($input, ';#')"/>
</xsl:template>
  
  2.  调用“函数”并将对此Lookup1字段的值进行处理,并返回URL值给变量ExtractedUrl。



<xsl:variable name="ExtractedUrl">
<xsl:call-template name="ExtractUrl">
<xsl:with-param name="input" select="@Lookup1"/>
</xsl:call-template>
</xsl:variable>

  
  3.  执行结果
  ExtractedUrl变量值:
  Hello, world
  
  
  二.实现递归/循环调用
  目标:以“,”作为分隔符,将字段Contacts的值(“NA,NB,NC”)格式化为XML字符串。
  
  1.  定义递归调用“函数”对字符串进行XML格式化。



<xsl:template name="XmlWrapper">
<xsl:param name="input"/>
<xsl:choose>
<xsl:when test="contains($input,',')">
<!- 输出第一个“,”前面的字符串(item为自定义标签,可换成别的任意标签) -->
<item>
<xsl:value-of select="substring-before($input,',')"/>
</item>
<!- 递归处理剩余字符串 -->
<xsl:call-template name="XmlWrapper">
<xsl:with-param name="input" select="substring-after($input,',')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!- 不包含“,”直接输出内容 -->
<item>
<xsl:value-of select="$input"/>
</item>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

  
  2.  调用“函数”



<xsl:variable name="ContactsXml">
<!- 把内容输出到contacts标签内 -->
<contacts>
<xsl:call-template name="XmlWrapper">
<xsl:with-param name="input" select="@Contacts"/>
</xsl:call-template>
</contacts>
</xsl:variable>

  
  3.  执行结果
  ContactsXml变量值:



<contacts>
<item>NA</item>
<item>NB</item>
<item>NC</item>
</contacts>

  
  
  三.将字符串信息格式化为XML数据。
  目标:以“,”作为分隔符,将字符串“NA,NB,NC”信息绑定到下拉菜单控件。


  • 结合前面的内容,定义“函数”将XML字符串转换为可查询的XML数据,并将数据循环绑定到下拉菜单控件。



<xsl:template name="GenerateDDL">
<xsl:param name="input"/>
<!- 将原始字符串格式化为XML字符串 -->
<xsl:variable name="ContactsXml">
<contacts>
<xsl:call-template name="XmlWrapper">
<xsl:with-param name="input" select="@Contacts"/>
</xsl:call-template>
</contacts>
</xsl:variable>
<select id="DDL-{generate-id()}">
<!- msxsl:node-set()函数将XML字符串转化为可查询的XML数据 -->
<xsl:for-each select="msxsl:node-set($ContactsXml)/contacts/item">
<option>
<xsl:value-of select="."/>
</option>
</xsl:for-each>
</select>
</xsl:template>

  
  2. 调用“函数”。



<xsl:call-template name="GenerateDDL">
<xsl:with-param name="input" select="@Contacts"/>
</xsl:call-template>

  
  3. 输出结果



<select id="DDL-ID0EAAA">
<option>NA</option>
<option>NB</option>
<option>NC</option>
</select>
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118315-1-1.html 上篇帖子: 一步一步开发属于自己的SharePoint 2010工作流 下篇帖子: [SharePoint的那些事儿-InfoPath]利用InfoPath 2010实现级联字段
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表