xsl-list
[Top] [All Lists]

[xsl] Ignoring Duplicates In key()

2006-09-14 10:17:52
Here's some fun in XSLT 1.0, using variously the MSXML 3.0 or xsltproc
processors (result behaviors are the same).

Here's some data...

  <factor group="0" >
     <number>100</number>
     <components>
       <component>widget</component>
     </components>
   </factor>
   <factor group="1">
     <number>110</number>
      <components>
       <component>widget</component>
       <component>gewgaw</component>
     </components>
   </factor>
   <factor group="1">
     <number>112</number>
     <components>
       <component>gewgaw</component>
     </components>
   </factor>

My need is to create a string of unique "components" in a "group". The
original XSLT for this relied on a recursion structure and wasn't
successfully blocking duplicates. My notion was to just wait for it to
finish all the recursion (for its other needs), and then hit it with a
key(), defined thus:

(XSLT fragment)

<xsl:key name="ComponentByGroup" match="component" use="../../@group" />

(and then)

<xsl:variable name="ComponentString">
   <xsl:for-each
select="key('ComponentByGroup',$group)[not(.=preceding::component)]">
       <xsl:sort select="."/>
       <xsl:if test="position() > 1">
            <xsl:text>, </xsl:text>
        </xsl:if>
        <xsl:value-of select="." />
   </xsl:for-each>
</xsl:variable>

The desired output would be "gewgaw, widget", but for some reason I'm
getting only "widget." When applied to more complex data, in one case
where 12 items should be displayed, it's correctly stopping the
duplicates but also making two singletons vanish.

The [not(.=preceding::component)] is the basic structure I found for
reducing duplicates, but it doesn't seem to play quite nicely with the
key() ... it's reducing too many!

Thoughts welcome.

Bob Portnell
simply(_dot_)bobp(_at_)gmail(_dot_)com

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>