Re: [xsl] apply-templates repeats inside xsl:for-each, why

Subject: Re: [xsl] apply-templates repeats inside xsl:for-each, why
From: "Syd Bauman s.bauman@xxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 16 Jun 2014 01:03:41 -0000
Well, without seeing at least the code that matches <concept> and
the portion of the input that has <concept>, it's hard to impossible
to say. But my first guess would be that the code that matches
<concept id="unique_2"> generates one line of output for each
<platform>.

But a few odd things jump to mind:
 
 * It would seem there is both a <platform> and a <concept> with
   id=unique_2. While not necessarily invalid, most of us think of
   the id= attribute as an ID attribute, and thus necessarily
   unique. But even if your schema (unwisely, I daresay) permits
   values of id= to be non-unique, it seems terribly misleading to
   say in the value it self that it is unique, when it's not.

 * The predicate "[@id = @id]" will never return false, and thus
   seems a bit silly. (Perhaps you meant "[@id = $id]"? I've made
   that mistake :-)

> I'm running xsl:for-each on a variable $platforms that holds this:
> 
>        <platform name="windows_xp" id="unique_2"/>
>        <platform name="windows_vista" id="unique_35"/>
>        <platform name="windows_7" id="unique_37"/>
> 
> The following code produces the same output 3 times for each node in 
> $platforms:
> 
>          <xsl:for-each select="$platforms/platform">
>            <xsl:apply-templates select="$root-of-input-file/map/concept/concept[@id = @id]"/>
>          </xsl:for-each>
> 
> So in the output I get this kind of thing:
> 
> Windows XP
> Windows Vista
> Windows 7
> Windows XP
> Windows Vista
> Windows 7
> Windows XP
> Windows Vista
> Windows 7
> 
> I was expecting to get one output for each element in
> $platforms. If I use the following outside of xsl:for-each, I get
> one output:
> 
> <xsl:apply-templates select="$root/map/concept/concept[@id = 'unique_2']"/>
> 
> What am I missing?

Current Thread