xsl-list
[Top] [All Lists]

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

2014-06-15 20:34:33
I fixed it for my purposes by doing it this way:

        <xsl:variable name="num" select="count($platforms/platform)"/>
        <xsl:for-each select="1 to $num">
          <xsl:variable name="n" select="position()"/>
<xsl:apply-templates select="$root/map/concept/concept[@id = $platforms/platform[$n]/@id]"/>
        </xsl:for-each>

Then I get the output just once like this:

Windows XP
Windows Vista
Windows 7

Thanks for the help in breaking some adhesions.

Mark

On 6/15/14 6:22 PM, Mark Giffin m1879(_at_)earthlink(_dot_)net wrote:
I think I've narrowed it down a bit. This code calls no templates:

        <xsl:variable name="num" select="count($platforms/platform)"/>

        <xsl:for-each select="1 to $num">
          <xsl:value-of select="$platforms/platform[position()]/@id"/>
          <xsl:text>&#10;</xsl:text>
        </xsl:for-each>

This outputs the following:
unique_2 unique_35 unique_37
unique_2 unique_35 unique_37
unique_2 unique_35 unique_37

Why does it repeat this 3 times instead of just once? If I remove one of the nodes in $platforms so there are only 2 nodes, then I get this:
unique_2 unique_35
unique_2 unique_35

By the way, the @id's are repeated in the same file, but they are in separate namespaces. It's not a structure of my making, it's a temp file produced by the DITA Open Toolkit, if you happen to be familiar with that.


On 6/15/14 6:03 PM, Syd Bauman s(_dot_)bauman(_at_)neu(_dot_)edu wrote:
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?


--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--

<Prev in Thread] Current Thread [Next in Thread>