[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
Re: [xsl] Term/Definition Lookup
Subject: Re: [xsl] Term/Definition Lookup From: "Ihe Onwuka ihe.onwuka@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Wed, 11 Jun 2014 19:35:30 -0000 |
<xsl:template match="root"> <root> <defs> <xsl:apply-templates select="lookup/def"/> </defs> </root> </xsl:template> <xsl:template match="def[following-sibling::def]"> <xsl:apply-templates/> <xsl:text>,</xsl:text> </xsl:template> On Wed, Jun 11, 2014 at 8:01 PM, Rick Quatro rick@xxxxxxxxxxxxxx < xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > Hi, > > I have a comma-separated list of "terms". I want to loop through each term > and end up with a comma-separated list of definitions. I am using XSLT 1.0. > Here is my xml: > > <?xml version="1.0" encoding="UTF-8"?> > <root> > <terms>A, B, C, D, E</terms> > <lookup> > <term>A</term> > <def>Def for A</def> > <term>B</term> > <def>Def for B</def> > <term>C</term> > <def>Def for C</def> > <term>D</term> > <def>Def for D</def> > <term>E</term> > <def>Def for E</def> > </lookup> > </root> > > The xml file has a built-in "lookup table" and here is the desired output: > > <?xml version="1.0" encoding="UTF-8"?> > <root> > <defs>Def for A, Def for B, Def for C, Def for D, Def for E</defs> > </root> > > Here is my stylesheet: > > <?xml version="1.0" encoding="UTF-8"?> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > version="1.0"> > > <xsl:output method="xml" indent="yes"/> > > <xsl:template match="/"> > <xsl:apply-templates/> > </xsl:template> > > <xsl:template match="lookup"/> > > <xsl:template match="terms"> > <root> > <defs> > <xsl:call-template name="get-defs"> > <xsl:with-param name="list" select="."/> > </xsl:call-template> > </defs> > </root> > </xsl:template> > > <xsl:template name="get-defs"> > <xsl:param name="list"/> > <xsl:variable name="wlist" > select="concat(normalize-space(translate($list,',',' ')),' ')"/> > <xsl:choose> > <xsl:when test="$wlist!=' '"> > <xsl:variable name="first" > select="substring-before($wlist,' > ')"/> > <xsl:variable name="rest" select="substring-after($wlist,' > ')"/> > <xsl:variable name="total"> > <xsl:call-template name="get-defs"> > <xsl:with-param name="list" select="$rest"/> > </xsl:call-template> > </xsl:variable> > <xsl:variable name="def"> > <xsl:call-template name="get-def"> > <xsl:with-param name="term" select="$first"/> > </xsl:call-template> > </xsl:variable> > <xsl:message><xsl:value-of select="$def"/></xsl:message> > <xsl:choose> > <xsl:when test="$total=''"> > <xsl:value-of select="$def"/> > </xsl:when> > <xsl:otherwise> > <xsl:value-of select="concat($def,', ',$total)"/> > </xsl:otherwise> > </xsl:choose> > </xsl:when> > </xsl:choose> > </xsl:template> > > <xsl:template name="get-def"> > <xsl:param name="term"/> > <xsl:value-of select="//def[preceding-sibling::term=$term]"/> > </xsl:template> > </xsl:stylesheet> > > This works, but I have a couple of curiosities that I am trying to work > through. If I change one of the terms so that the "get-def" template > doesn't > match (for example, "B" to "BB"), I get this: > > <?xml version="1.0" encoding="UTF-8"?> > <root> > <defs>Def for A, , Def for C, Def for D, Def for E</defs> > </root> > > I thought I could use an <xsl:if test="$def!=''"> right before the last > <xsl:choose> statement, but when I do, I only get this: > > <?xml version="1.0" encoding="UTF-8"?> > <root> > <defs>Def for A</defs> > </root> > > Once there is no match on "B" it short-circuits the rest of the list. Any > help or guidance would be appreciated. Thanks. > > Rick Quatro > > Rick Quatro > Carmen Publishing Inc. > 585-366-4017 > rick@xxxxxxxxxxxxxxx
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Term/Definition Lookup, Rick Quatro rick@xxx | Thread | Re: [xsl] Term/Definition Lookup, Terry Badger terry_b |
[xsl] Term/Definition Lookup, Rick Quatro rick@xxx | Date | Re: [xsl] [XSL-FO] marginal notes, Geert Bormans geert@ |
Month |