xslt loop on a semicolon seperated list

I will have a value that is a semi colon delimited string.
<xsl:value-of select="@Keyword"/>

keyword1;keyword2;keyword3

I want something in my xslt that will look and create list items out of the values that are seperated by semi-colons.

So
keyword1;keyword2;keyword3

Would be
<ul>
  <li>keyword1</li>
  <li>keyword2</li>
  <li>keyword3</li>
</ul>

Thanks
jackjohnson44Asked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
Geert BormansConnect With a Mentor Information ArchitectCommented:
mmh, am I wrong in assuming you are a real beginner?

templates can not be nested
you should put them next to each-other

This sounds like sharepoint, is it?
So you are bound to XSLT1, you cannot use tokenize() then

Here is how you should organize the templates
    <xsl:template name="dvt_1.rowview">
        <tr>
            <td>			
                <table border="1" cellspacing="0" width="100%">
                    <tr>
                        <td>
                            Title: <xsl:value-of select="@Title"/><br />
                            Description: <xsl:value-of select="@KpiDescription"/><br />
                            Keyword: <br />
                            <ul>
                                <xsl:call-template name="splitter">
                                    <xsl:with-param name="str" select="@Keyword"/>
                                    <xsl:with-param name="sep" select="';'"/>
                                </xsl:call-template>
                            </ul>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
    </xsl:template>
    
    <xsl:template name="splitter">
        <xsl:param name="str"/>
        <xsl:param name="sep"/>
        <xsl:choose>
            <xsl:when test="contains($str, $sep)">
                <li><xsl:value-of select="substring-before($str, $sep)"/></li>
                <xsl:call-template name="splitter">
                    <xsl:with-param name="str" select="substring-after($str, $sep)"/>
                    <xsl:with-param name="sep" select="$sep"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <li><xsl:value-of select="$str"/></li>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

Open in new window

0
 
Geert BormansInformation ArchitectCommented:
you will need some recursive processing in XSLT1
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" version="1.0">
    <xsl:variable name="keyword">keyword1;keyword2;keyword3</xsl:variable>
    <xsl:template match="/">
        <ul>
            <xsl:call-template name="splitter">
                <xsl:with-param name="str" select="$keyword"/>
                <xsl:with-param name="sep" select="';'"/>
            </xsl:call-template>
        </ul>
    </xsl:template>
<xsl:template name="splitter">
    <xsl:param name="str"/>
    <xsl:param name="sep"/>
    <xsl:choose>
        <xsl:when test="contains($str, $sep)">
            <li><xsl:value-of select="substring-before($str, $sep)"/></li>
            <xsl:call-template name="splitter">
                <xsl:with-param name="str" select="substring-after($str, $sep)"/>
                <xsl:with-param name="sep" select="$sep"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <li><xsl:value-of select="$str"/></li>
        </xsl:otherwise>
    </xsl:choose>
    
</xsl:template></xsl:stylesheet>

Open in new window

0
 
Geert BormansInformation ArchitectCommented:
of course, it is a lot easier if you could use XSLT2
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:variable name="keyword">keyword1;keyword2;keyword3</xsl:variable>
    <xsl:template match="/">
        <ul>
            <xsl:for-each select="tokenize($keyword, ';')">
                <li><xsl:value-of select="."/></li>
            </xsl:for-each>
        </ul>
    </xsl:template>
</xsl:stylesheet>

Open in new window

0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
Geert BormansInformation ArchitectCommented:
Note that I pasted the string in a variable, ofcourse you can call the tokenize() or the named template directly on the attribute
0
 
jackjohnson44Author Commented:
Thanks, but I am not exactly understanding.  I tried your code in mine and it has a problem putting an xsl:template inside another template.  Also, what did you say about tokenize?  Sorry, I am really having trouble with this.

how could I do it with
<xsl:value-of select="@Keyword"/>
<xsl:template name="dvt_1.rowview">
<tr>
<td>			
<table border="1" cellspacing="0" width="100%">
<tr>
<td>
Title: <xsl:value-of select="@Title"/><br />
Description: <xsl:value-of select="@KpiDescription"/><br />
Keyword: <xsl:value-of select="@Keyword"/><br />

<xsl:variable name="keyword">keyword1;keyword2;keyword3</xsl:variable>
<xsl:template match="/">
<ul>
<xsl:for-each select="tokenize($keyword, ';')">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</xsl:template>

Open in new window

0
 
jackjohnson44Author Commented:
Yes SharePoint, YES to beginner (at least with xslt).  I would much rather do this via code instead of xslt.  Thanks, I will try this.
0
 
Geert BormansInformation ArchitectCommented:
oh, you could do this with javascript inside your XSLT since you are using the microsoft XSLT processor,
but that would be even more tricky
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.