zoukankan      html  css  js  c++  java
  • [转]SharePoint内容定制之XSLT高级用法——带返回值的函数调用

    前言:通常大家使用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>

     转自:http://www.cnblogs.com/crazysharepoint/

    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”信息绑定到下拉菜单控件。

    1. 结合前面的内容,定义“函数”将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>
  • 相关阅读:
    中国大学排名爬虫
    基于bs4库的HTML内容查找方法和HTML格式化和编码
    自动化提取51啦数据的信息
    简单目录扫描工具
    一个简单音乐播放器
    【原创】C++中对象的序列化
    [android]android开发中的运行错误之:adb.exe
    [转载]十大编程算法助程序员走上高手之路
    [原创]二叉树相关笔试题代码
    [原创]VS2010中创建动态链接库及其调用
  • 原文地址:https://www.cnblogs.com/kxlf/p/2230964.html
Copyright © 2011-2022 走看看