Altova Mailing List Archives>Archive Index >microsoft.public.xsl Archive Home >Recent entries >Thread Prev - Re: does xpath expressions/matches support variables? >Thread Next - Re: does xpath expressions/matches support variables? Re: does xpath expressions/matches support variables?To: NULL Date: 6/4/2006 2:59:00 AM
I'm a little confused by your statement that XSL can't generate dynamic XSL.
Aren't the following (valid) alternative uses of a variable also examples of
dynamic behaviour, whereby the generated XSL/HTML code changes as it is
processed?;
a) assigned element text value to the variable
b) supply as an argument to an xpath function, eg. concat($var, ".ext")?
eg. snippet of relevant XML
<root>
<bearerTable>
<bearer>
<name>ethernet</name>
...other elements
</bearer>
<bearer>
<name>ppp</name>
...other elements
</bearer>
</bearerTable>
<networkTable>
<network>
<name>home</name>
<bearerRef>bearer.ppp</bearerRef>
...other elements
</network>
<network>
<name>work</name>
<bearerRef>bearer.ethernet</bearerRef>
...other elements
</network>
</networkTable>
</root>
What i'm trying to do is translate above xml into html as follows;
a) marking up all <name> elements as anchors, eg. <a name="bearer.ethernet">
b) marking up all <xxxxxRef> elements as anchor references, eg. <a
href="#bearer.ethernet">
Easy enough, except that before i create the anchor references, i want to
check if the specified xml bearer element actually exists first.
eg. xsl with bearer ref as current context
<!-- using some string xpath fns; concat, substring-before, etc. to create a
string variable that holds a valid xpath like;
$ref=/root/bearerTable/bearer/name/ethernet -->
<xsl:if test="$ref">
...create anchor reference
</xsl:if>
One alternative i've found is to explicitly check each <name> value in a
xsl:for-each loop, but in my view this is very messy & slow(?). Personally,
i'd prefer to let XSL do the hardwork and use it's XPath pattern matching...
but is this possible when the XPath argument is supplied as a variable?
cheers
stoj
"Anthony Jones" wrote:
>
> "stoj" <stoj@d...> wrote in message
> news:AD9BDA51-058A-4006-8CC4-1369D77C1745@m......
> > I need to use a variable (similar scenario also for a template parameter)
> > that has been assigned with an xpath string as an xpath expression/match
> for
> > xsl elements such as xsl:if, xsl:what, xsl:template, etc.
> >
> > Eg. xsl snippet - intended to invoke execute-code block if the node
> exists.
> > It works perfectly if i replace "$var" with "/root/parent/child".
> >
> > <xsl:variable name="var">/root/parent/child</xsl:variable>
> > <xsl:if test="$var">
> > ...execute-code
> > </xsl:if>
> >
> > 1. Observed behaviour is that the if statement always fires. Presumably
> > because it is resolving to <xsl:if test="'/root/parent/child'">, which
> > resolves to true. If this is true, how can i change this to <xsl:if
> > test="/root/parent/child">? Is there a function availble to strip away
> the
> > extra quotations?
> >
> > 2. Does anyone know of a *clean* design pattern to solve this? Preferably
> > one that i can call as a generic template/function to allow it to called
> at
> > whim.
> >
> > cheers
> > stoj
>
> What you are trying to do is create Dynamic XSL that is XSL that changes as
> it's processed. This is not possible since the XSL is parsed and compiled
> in to a processing engine which can not be modified on the fly.
>
> We would need to know more about what you are doing to offer any serious
> help.
>
> Some things that might help are xsl:choose, extensive use of templates and
> the mode attribute.
>
> Anthony.
>
>
>
| ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
