Re: [xsl] Wildcard problem

Subject: Re: [xsl] Wildcard problem
From: Ragulf Pickaxe <ragulf.pickaxe@xxxxxxxxx>
Date: Thu, 6 Oct 2005 13:37:39 +0200
Hi again Houman,

> I don't get an error with your code. However I get a count of 10 when I
> should have gotten 2.
>
> <WAAUX03MeterPulse action="add">
> <WAAUX03WithholdNumber action="add">
> <WAAUX01MeterPulse action="add">
> <WAAUX01Bar141 action="add">
> <WAAUX01CallBarring action="add">
> <WAAUX01Line action="add">
> <WAAUX03ICB action="add">
> <WAAUX01OCBE action="add">
> <WAAUX03OCB action="add">
> <WAAUX03Line action="add">
>
> It still counts everything with WAAUX following two digits, which are
> 10.

This goes for both David's and my solution. They cound _unique_ names
beginning with WAAUX having two digits right after.

...
>
> As I said, I am very new to muenchian grouping. However could it be that
> this is wrong:
>
> <xsl:key name="WAAUX" match="*[starts-with(name(),'WAAUX')]"
> use="name()"/>
>
> Because not each element that starts with WAAUX needs a unique index.
> But each element that starts with WAAUX AND a two number digits needs a
> unique index, right?  But how is this possible? The Translate won't help
> in this situation. Unless the problem is somewhere else...
>
> Many thanks
> Houman
>
>
> > However the translate() funcation eliminates this differences.
> > Is that possible or too complicated for XSLT?
>
> You just need to do the de-duplication before the translate.
> eg using keys (muenchian grouping)
>
> <xsl:key name="WAAUX" match="*[starts-with(name(),'WAAUX')]"
> use="name()"/>
>
>
> <xsl:value-of select="count(*
> [generate-id()=generate-id(key('WAAUX',name())[1])]
> [starts-with(translate(name(),'123456789','000000000'),'WAAUX00')])"/>

I think you can change this to:
<xsl:key name="WAAUX" match="*[starts-with(name(),'WAAUX')]"
use="substring(name(),1,7)"/>

<xsl:value-of
select="count(*[generate-id()=generate-id(key('WAAUX',substring(name(),1,7))[
1])][starts-with(translate(name(),'123456789','000000000'),'WAAUX00')])"/>

That is, the solution should now distinguish only on those first 7
characters in the element name.

In my solution, you should change the predicate:
[not(name()=preceding::*/name())] to
[not(substring(name(),1,7)=preceding::*/substring(name(),1,7))]

Regards,
Ragulf Pickaxe :-)

Current Thread