RE: [xsl] Close but a little off

Subject: RE: [xsl] Close but a little off
From: "Passin, Tom" <tpassin@xxxxxxxxxxxx>
Date: Wed, 16 Apr 2003 16:57:17 -0400
[Karl J. Stubsjoen]

This is too unclear to try to fix without more information, like what
the source xml looks like, and what you want to accomplish.  You have
"xml" referred to one time as a relative path, one time with a "//", and
one time with a "/'.  This makes it very uncertain whether "xml" is the
document element or not.

Also, there is no relation between the for-each block and the row
matched by the template, so what you are showing seems pointless (I am
sure there _is_ a point, though, hence the need for more info).  You
said you wanted a "match" - but not what that is supposed to mean - and
you show no effort to include any "match" in your template.

However, there are a few observations to make, even without knowing
answers to the above items.  First of all, use variables.  Assuming that
there are some number of rows (more than one), create a variable for
//xml/s:Schema/s:ElementType/s:AttributeType and re-use it so its
node-set only needs to be evaluated once.  Also, why start that path
with "//"?  Unless your source xml is pretty unusual, that expression
can only slow down the processing without adding any value.

You can make use of expressions from outside the for-each block by using
variables.  Thus -

<xsl:variable name='row-name' select='@name'/>

Then inside the for-each block,

<xsl:value-of select='$row-name'/>

But I suspect you may be wanting something more like

select="/xml/rs:data/z:row/@*[name() = $row-name]"

(although I do not quite see what you want to do with it once you get
it).  However, /xml/rs:data/z:row is a fixed path that you could also
put into a variable.  I imagine that you wish that path to track to path
shown in the match path of the template, but  it will not the way you
have shown in.

Finally, it is very unlikely that you need a compound path in the match
attribute.  You have 

match='xml/rs:data/z:row'

Except for very unusual cases, you just want to have 

match='z:row'

The rest of the context should be set by the select statement that
causes this template to be invoked.  If you want to have different
processong of a z:row depending on where you call it from, use modes on
the templates.

Cheers,

Tom P

> I'm close, but just a little off and am not sure how to refer 
> to the parent
> (think its considered parent) xpath.
> I have the following template:
> 
> <xsl:template match="xml/rs:data/z:row">
> <table border="1">
>  <xsl:for-each select="//xml/s:Schema/s:ElementType/s:AttributeType">
>     <tr>
>      <td><xsl:value-of select="@name"/></td>
>      <td><xsl:value-of select="/xml/rs:data/z:row/@name"/>&nbsp;</td>
>     </tr>
>     </xsl:for-each>
> </table>
> </xsl:template>
> 
> In english, this translates to:
> For each row loop throught the s:AttributeType node.  This 
> node contains the
> name of the attribute for the field, the size of the element, 
> etc... I need
> to return the name of the attribute and then use this name to 
> match the
> attribute in the original match "xml/rs:data/z:row".
> I'm close... in my 2nd xsl:value-of, I'm not sure how to 
> refer to the values
> from the original match and not values which are coming from 
> the for-each
> loop.
> Hope that makes sense.
> Thanks,
> Karl
> 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 
> 

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread