[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
[Recent Entries]
[Reply To This Message]
Re: Keys and select distinct - is that the solution ?
Subject: Re: Keys and select distinct - is that the solution ?
From: "Christian Rasmussen" <christiankrasmussen@xxxxxxxxx>
Date: Sat, 3 Jun 2006 01:30:19 +0200
|
I have now tried the solutions, but none of them works.
Actually I dont think I need to use the generic_id, do I?
Because I don't need to make all the elements unique!!? As far as I
can see, I only have to pick out all the distinct codes.
By doing that I do have to match on the content of the node, and not
the element name, right!? If I match on the content/text of the node
couldn't I say something like take all the elements whose content is
not in any preeceding sibling content ???
that would give me a uniqe list of codes which I can through into a
key, that gives me the manure names
This template works, but it just writes out the manure names twice for
the code 4 and 5.
<xsl:template name="ManureTypeNames">
<xsl:for-each
select="eih:ManureTypeCollection/eih:ManureTypeStructure/gr:ManureTypeCode">
<fo:block><xsl:value-of
select="key('ManureType',node())"/></fo:block>
</xsl:for-each>
</xsl:template>
Could someone please help me with the expath that select that matches
on the content/text and checks if there is no preeceding siblings?
please help
thanks,
- 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
|
PURCHASE STYLUS STUDIO ONLINE TODAY!
Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!
Download The World's Best XML IDE!
Accelerate XML development with our award-winning XML IDE - Download a free trial today!
Subscribe in XML format
RSS 2.0 |
|
Atom 0.3 |
|
|