Altova Mailing List Archives>Archive Index >xsl-list Archive Home >Recent entries >Thread Prev - [xsl] Keys and select distinct - is that the solution ? [Thread Next] Re: [xsl] Keys and select distinct - is that the solution ?To: Date: 6/2/2006 10:37:00 PM First of all thanx to both of you for trying to help. right now I am trying to apply your suggestions.... I am a quite newbie and I am not not sure I understand the muenchian method, but regarding your last statement Wendell Piez: I believe it is a many to many relation: If you look back on my input, you can see that the code 5 for instance is listed two times in one of the structures (aka tables), and I have to take that value and look it up somewhere else in the document (aka another table) and return the value "Ajle". That is a one to many.... well, I'll go work on those two other suggestions... - Christian On 6/3/06, Wendell Piez <wapiez@xxxxxxxxxxxxxxxx> wrote: 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 gxdning</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 | ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
