This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Data structure in XSLT?


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"/>:&#xA;<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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]