Tag: xml

  • XSL:split-string function

    One of the reasons I like developing for SharePoint is that I get to work with many different technologies and platforms.  When I am designing a custom list for (display, edit or new), There are times where I may have a delimited string in a field that I want to display differently on the screen.  Since the forms are all XSL style sheets, it is helpful to have a few XSL templates to process the data.

    I wrote this XSL template so I could wrap some HTML around any element in a delimited list.  This is specifically geared towards XSL 1.0.  In XSL 2.0, I would most likely use tokenize.  I’m not an expert at XSL so if anyone has any suggestions that would improve this template, please leave comments.

    <xsl:template name="split-string">
    <xsl:param name="list" />
    <xsl:param name="delimiter" />
    <xsl:param name="id" />
    <xsl:if test="normalize-space($list)">
    <xsl:variable name="newlist">
    <xsl:choose>
    <xsl:when test="contains($list, $delimiter)">
    <xsl:value-of select="normalize-space($list)" />
    </xsl:when>
    <xsl:otherwise>
    <xsl:value-of select="concat(normalize-space($list), $delimiter)"/>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:variable>
    
    <xsl:variable name="first" select="substring-before($newlist, $delimiter)" />
    <xsl:variable name="remaining" select="substring-after($newlist, $delimiter)" />
    <!-- This is where you need to put the display code -->
    <a>
    <xsl:attribute name="href">./Attachments/<xsl:value-of select="$id" />/<xsl:value-of select="$first" /></xsl:attribute>
    <xsl:attribute name="target">_blank</xsl:attribute>
    <img src="~/_layouts/images/doclink.gif" width="16" height="16" alt="" border="0" />
    <xsl:value-of select="$first" />
    </a>
    <!--  end display code -->
    <xsl:if test="$remaining">
    <!-- I put a little display code here also -->
    <br />
    <!-- end display code -->
    <xsl:call-template name="split-string">
    <xsl:with-param name="list" select="$remaining" />
    <xsl:with-param name="delimiter">
    <xsl:value-of select="$delimiter"/>
    </xsl:with-param>
    <xsl:with-param name="id"><xsl:value-of select="$id" /></xsl:with-param>
    </xsl:call-template>
    </xsl:if>
    </xsl:if>
    </xsl:template>
    

    You can add or remove variables depending on what you need. In the above example code, I had a semi-colon list of email attachment file names that were attached to the list. I wanted to create a ‘clickable’ link to each file, which is why I needed the ID field. Normally, you wouldn’t need the ID field.

    This is how I called the template in my XSL:

    <xsl:call-template name="split-string">
    <xsl:with-param name="list"><xsl:value-of select="@EmailAttachmentNames" /></xsl:with-param>
    <xsl:with-param name="delimiter">;</xsl:with-param>
    <xsl:with-param name="id"><xsl:value-of select="@ID" /></xsl:with-param>
    </xsl:call-template>