xsl-list
[Top] [All Lists]

Re: [xsl] Keys and select distinct - is that the solution ?

2006-06-02 15:16:25
Dear Christian,

XSLT 2.0 has a distinct-values() function, which is useful for this kind of thing, along with its native grouping constructs.

In XSLT 1.0, it's a fairly standard grouping problem. Usually we de-duplicate a set of nodes by determining which members of the set are the first (in document order) with a given value. In your case, you have to decide whether the value you want to check is the code value, or the name (if they're in a strict one-to-one relation it doesn't matter, and the value is more convenient).

Keys are a very convenient way to de-duplicate when your data set is large. You can use brute XPath if not.

So:

<xsl:key name="manure-type-codes" match="gr:ManureTypeCode"
  use="."/>

<xsl:key name="manure-type-names" match="gr:ManureTypeName"
  use="../gr:ManureTypeCode"/>

<xsl:template match="gr:ManureTypeCode">
  <xsl:if test="generate-id() = generate-id(key('manure-type-codes',.)[1])">
    <!-- tests true only if the ManureTypeCode is the first with this value,
         more or less the equivalent of 'select distinct' -->
    <xsl:copy-of select="key('manure-type-names',.)"/>
  </xsl:if>
</xsl:template>

If the codes and names are in a one-to-many or many-to-many relation, we have to think harder.

I hope this helps!
Wendell

At 05:55 PM 6/2/2006, you wrote:
Hi experts,

I've been struggling with a problem for several hours now, and I
cannot find the solution:
I have an XML document with a elements grouped in elements and
ManureTypeCodes and datavalues as siblings.
Then I have - somewhere else - in the document lookup information
(labels) for the codes.
These are grouped in elements of ManureTypeCodes and ManureTypeNames

I want to create a template rule which matches the codes and looks up
the corresponding name and ONLY writes the
ManureTypeName out once! In RDBMS I would use something like select
distinct when selecting the codes, but I dont know what the right
approach is in XSLT.

can someone please help.... on before hand thank you!

my XML:
<eih>
   <!-- Codes and data  -->
   <eih:ManureTypeCollection>
       <eih:ManureTypeStructure>
           <gr:ManureTypeCode>5</gr:ManureTypeCode>
           <gr:ElementIdentifier>N</gr:ElementIdentifier>
           <gr:ElementQuantity>17.0</gr:ElementQuantity>
       </eih:ManureTypeStructure>
       <eih:ManureTypeStructure>
           <gr:ManureTypeCode>5</gr:ManureTypeCode>
           <gr:ElementIdentifier>P</gr:ElementIdentifier>
           <gr:ElementQuantity>0.6</gr:ElementQuantity>
       </eih:ManureTypeStructure>
       <eih:ManureTypeStructure>
           <gr:ManureTypeCode>4</gr:ManureTypeCode>
           <gr:ElementIdentifier>N</gr:ElementIdentifier>
           <gr:ElementQuantity>17.5</gr:ElementQuantity>
       </eih:ManureTypeStructure>
       <eih:ManureTypeStructure>
           <gr:ManureTypeCode>4</gr:ManureTypeCode>
           <gr:ElementIdentifier>P</gr:ElementIdentifier>
           <gr:ElementQuantity> 6.3</gr:ElementQuantity>
       </eih:ManureTypeStructure>
   </eih:ManureTypeCollection>

   <!-- look up information for the codes -->
   <eih:XImanureTypeCollection>
       <eih:XImanureTypeStructure>
           <gr:ManureTypeCode>4</gr:ManureTypeCode>
           <gr:ManureTypeName>Fast gødning</gr:ManureTypeName>
       </eih:XImanureTypeStructure>
       <eih:XImanureTypeStructure>
           <gr:ManureTypeCode>5</gr:ManureTypeCode>
           <gr:ManureTypeName>Ajle</gr:ManureTypeName>
       </eih:XImanureTypeStructure>
       <eih:XImanureTypeStructure>
   </eih:XImanureTypeCollection>
</eih>


best regards,

Christian Rasmussen
Denmark

--~------------------------------------------------------------------
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>
--~--


--~------------------------------------------------------------------
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>
--~--