Solved

xslt loop on a semicolon seperated list

Posted on 2010-08-23
7
647 Views
Last Modified: 2013-11-18
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
0
Comment
Question by:jackjohnson44
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 2
7 Comments
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 33504594
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
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 33504609
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
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 33504617
Note that I pasted the string in a variable, ofcourse you can call the tokenize() or the named template directly on the attribute
0
The Ultimate Checklist to Optimize Your Website

Websites are getting bigger and complicated by the day. Video, images, custom fonts are all great for showcasing your product/service. But the price to pay in terms of reduced page load times and ultimately, decreased sales, can lead to some difficult decisions about what to cut.

 

Author Comment

by:jackjohnson44
ID: 33505023
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
 
LVL 60

Accepted Solution

by:
Geert Bormans earned 500 total points
ID: 33505268
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
 

Author Comment

by:jackjohnson44
ID: 33505551
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
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 33505630
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

Featured Post

[Webinar] Learn How Hackers Steal Your Credentials

Do You Know How Hackers Steal Your Credentials? Join us and Skyport Systems to learn how hackers steal your credentials and why Active Directory must be secure to stop them. Thursday, July 13, 2017 10:00 A.M. PDT

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I will show you how to create a ASP.NET Captcha control without using any HTTP HANDELRS or what so ever. you can easily plug it into your web pages. For Example a = 2 + 3 (where 2 and 3 are 2 random numbers) Session("Answer") = 5 then we…
This article covers the basics of the Sass, which is a CSS extension language. You will learn about variables, mixins, and nesting.
Viewers will learn about basic arrays, how to declare them, and how to use them. Introduction and definition: Declare an array and cover the syntax of declaring them: Initialize every index in the created array: Example/Features of a basic arr…
The viewer will learn the basics of jQuery including how to code hide show and toggles. Reference your jQuery libraries: (CODE) Include your new external js/jQuery file: (CODE) Write your first lines of code to setup your site for jQuery…

724 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question