Subject: Re: [xsl] Keys and select distinct - is that the solution ? From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx> Date: Fri, 02 Jun 2006 18:14:29 -0400 |
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.
<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
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
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Keys and select distinct , David Carlisle | Thread | Re: [xsl] Keys and select distinct , Christian Rasmussen |
Re: [xsl] Keys and select distinct , David Carlisle | Date | Re: [xsl] Keys and select distinct , Christian Rasmussen |
Month |