This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Data structure in XSLT?
- From: Wendell Piez <wapiez at mulberrytech dot com>
- To: xsl-list at lists dot mulberrytech dot com
- Date: Tue, 23 Apr 2002 14:40:58 -0400
- Subject: Re: [xsl] Data structure in XSLT?
- Reply-to: xsl-list at lists dot mulberrytech dot com
Charles,
You can't use a hash map (the data model doesn't include such a thing) but
you can use a key, which is almost the same thing (or can be made to work
that way anyway):
<xsl:key name="competencies-by-category" match="competency"
use="substring-before(Competency/@id, ':')"/>
The value of the key for each Competency is thus "programming_language",
"application_server" etc.
Then:
<xsl:template match="Competency">
<xsl:variable name="this-category" select="substring-before(@id, ':')"/>
<xsl:if test="count(.|key('competencies-by-category',
$this-category)[1])=1">
<!-- the test uses an idiom to test node identity, throwing away Competency
elements after the first in every category -->
<xsl:value-of select="$this-category"/>:
<xsl:text/>
<xsl:for-each select="key('competencies-by-category', $this-category)">
<!-- now we go get all the Competency elements in this category and
list em -->
<xsl:if test="position()!=1">
<!-- no comma before the first -->
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:value-of select="substring-after(@id, ':')"/>
</xsl:for-each>
</xsl:if>
</xsl:template>
The code assumes that you never have more than one ':' in an @id. Also,
de-duplicating is left as an exercise.
Cheers,
Wendell
At 01:17 PM 4/23/2002, you wrote:
>Hi, is there anyway to build some data structure in
>XSLT? I have a sample input file that looks like this:
>
><Qualifications>
> <Competency name="Java">
> <Competency id="programming_language:java"/>
> </Competency>
> <Competency name="C++">
> <Competency id="programming_language:cpp"/>
> </Competency>
> <Competency name="C#">
> <Competency id="programming_language:csharp"/>
> </Competency>
> <Competency name="WebLogic">
> <Competency id="application_server:weblogic"/>
> </Competency>
> <Competency name="WebSphere">
> <Competency id="application_server:websphere"/>
> </Competency>
></Qualifications>
>
>The output I want is:
>
>programming_language:
>Java, C++, C#
>
>application_server:
>WebLogic, WebSphere
>
>The Competency elements can be in any order. I was
>thinking it would be nice if I have the luxury to use
>a hash map or something like that.
>
>Any idea?
>
>Thanks
>Charles
======================================================================
Wendell Piez mailto:wapiez@mulberrytech.com
Mulberry Technologies, Inc. http://www.mulberrytech.com
17 West Jefferson Street Direct Phone: 301/315-9635
Suite 207 Phone: 301/315-9631
Rockville, MD 20850 Fax: 301/315-8285
----------------------------------------------------------------------
Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list