This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Trouble writing .xsl
- From: Jason Rizer <jasonriz at yahoo dot com>
- To: xsl-list at lists dot mulberrytech dot com
- Date: Sun, 13 Jan 2002 15:42:34 -0800 (PST)
- Subject: Re: [xsl] Trouble writing .xsl
- Reply-to: xsl-list at lists dot mulberrytech dot com
Jani,
Thanks a million. I've now got everything working
perfectly ( I think :) )
-Jason
--- Jeni Tennison <jeni@jenitennison.com> wrote:
> Hi Jason,
>
> > Thanks, this solved my problem (as I stated it)
> perfectly. You're 8
> > lines of XPATH did what my 50 couldn't :) I guess
> there is a bit of
> > a learning curve. Still, I have one additional
> problem. I realized
> > that I didn't quite state my problem fully. It's
> not suffiecent that
> > I replace elements named ABC:jason.Smith with
> elements named
> > ABC:Smith, I've also got to repace any elements
> whose names begin
> > with ABC:jason.Smith the elements whose names
> begin with ABC:Smith
> > while leaving the rest of the element name
> unchanged.
>
> This is a little trickier, but ends up being the
> same number of lines
> ;)
>
> You need to replace the template that currently
> matches elements
> named ABC:jason.Smith with one that matches any
> element in the ABC
> namespace whose local name (the bit after the ABC:
> prefix) starts with
> 'jason.Smith'.
>
> You can match elements in the ABC namespace with:
>
> ABC:*
>
> Then you can use a predicate to test them further:
>
> ABC:*[...]
>
> You can get the local name with the local-name()
> function; and you can
> test whether a string begins with another string
> with the
> starts-with() function. So the pattern is:
>
> ABC:*[starts-with(local-name(), 'jason.Smith')]
>
> Within the template, your first task is to work out
> the name of the
> element that you want to create. This is the part of
> the local name of
> the element after the 'jason.'. You can use the
> substring-after()
> function to get this (or you could use substring(),
> but I think
> substring-after() is clearer):
>
> substring-after(local-name(), 'jason.')
>
> Your second task is to create an element of that
> name. You can do this
> with an xsl:element element; the name attribute of
> xsl:element is an
> attribute value template, which means that you can
> use calculated
> values if you wrap them in {}s:
>
> <xsl:element name="{substring-after(local-name(),
> 'jason.')}">
> ...
> </xsl:element>
>
> The rest of the template is the same - applying
> templates to
> attributes and children in order to copy them via
> the identity
> template. So the substitute template as a whole is:
>
> <xsl:template match="ABC:*[starts-with(local-name(),
> 'jason.Smith')]">
> <xsl:element name="{substring-after(local-name(),
> 'jason.')}">
> <xsl:apply-templates select="@*|node()" />
> </xsl:element>
> </xsl:template>
>
> I hope that helps,
>
> Jeni
>
> ---
> Jeni Tennison
> http://www.jenitennison.com/
>
>
> XSL-List info and archive:
> http://www.mulberrytech.com/xsl/xsl-list
>
__________________________________________________
Do You Yahoo!?
Send FREE video emails in Yahoo! Mail!
http://promo.yahoo.com/videomail/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list