|
Subject: Re: [xsl] XML to XML From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> Date: Thu, 27 Mar 2003 09:37:52 +0000 |
Hi Jim,
> I need some help in writing xsl to transform XML to XML.
> I am getting lost in concepts of having multiple templates
You've had several solutions already. This is one that, like
Wendell's, uses keys, but this only uses one key, which makes it a bit
simpler.
First, index each <Category> element using all but the last letter of
its <Code> element child:
<xsl:key name="categories"
match="Category"
use="substring(Code, 1, string-length(Code) - 1)" />
When you use the function call:
key('categories', 'A')
for example, you'll get every <Category> element whose <Code> element
has two letters and starts with an 'A'.
To start off, you want a template matching the <Categories> element to
apply templates to only those <Category> elements that have only one
letter codes; you can use the key to find these as they'll all be
indexed with the string '':
<xsl:template match="Categories">
<Categories>
<xsl:apply-templates select="key('categories', '')" />
</Categories>
</xsl:template>
Then you can have a single template for all the <Category> elements.
This is a little complicated by the fact that you want to have
different element names for <Category> elements at different levels,
but basically it creates the relevant element, then applies templates
to those <Category> elements (using the key again) whose <Code> starts
with the <Code> of the <Category> element that you're processing:
<xsl:template match="Category">
<xsl:variable name="level">
<xsl:choose>
<xsl:when test="string-length(Code) = 1">One</xsl:when>
<xsl:when test="string-length(Code) = 2">Two</xsl:when>
<xsl:when test="string-length(Code) = 3">Three</xsl:when>
<xsl:otherwise>
<xsl:message terminate="yes">
I thought you said there'd only be three levels!
</xsl:message>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="Level{$level}Category">
<xsl:attribute name="Code">
<xsl:value-of select="Code" />
</xsl:attribute>
<xsl:attribute name="Description">
<xsl:value-of select="Description" />
</xsl:attribute>
<xsl:apply-templates select="key('categories', Code)" />
</xsl:element>
</xsl:template>
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] XML to XML, Michael Kay | Thread | [xsl] Re: XML to XML, Dimitre Novatchev |
| Re: [xsl] xsl:function, Jeni Tennison | Date | Re: [xsl] Picking up the 2nd part t, Carles Canellas |
| Month |