Subject: Re: [xsl] (consistency in select results?) converting attributes to nested tags recursively From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> Date: Fri, 8 Feb 2002 20:25:57 +0000 |
Hi Edward, > Thanks for your help this is mostly what I was looking for but I was > hoping to do it in a way that used Template matches for the nodes > for the following reasons. OK. You still have to use a parameter to pass the attributes through from template to template. But you can change the createTag template into a template that matches attributes, as follows: <xsl:template match="@*"> <xsl:param name="attributes" select="../@*[position() > 1]" /> <tag name="{name()}" value="{.}"> <xsl:choose> <xsl:when test="$attributes"> <!-- if there are more attributes, apply templates to them to create the tag element's content --> <xsl:apply-templates select="$attributes[1]"> <xsl:with-param name="attributes" select="$attributes[position() > 1]" /> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <!-- if there aren't any more attributes, apply templates to the content of the current attribute's parent element --> <xsl:apply-templates select="../*" /> </xsl:otherwise> </xsl:choose> </tag> </xsl:template> Then for those attributes for which you need to create an element named after the attribute, you can do something like: <xsl:template match="@attrib1"> <xsl:param name="attributes" select="../@*[position() > 1]" /> <attrib1 value="{.}"> <xsl:choose> <xsl:when test="$attributes"> <xsl:apply-templates select="$attributes[1]"> <xsl:with-param name="attributes" select="$attributes[position() > 1]" /> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="../TagB" /> </xsl:otherwise> </xsl:choose> </attrib1> </xsl:template> Since the content of the two templates (and any more that you create) are similar, you could make a separate named template to handle creating the content of the elements. For the tagA element, you need something like: <xsl:template match="tagA"> <xsl:apply-templates select="@*[1]" /> </xsl:template> For the TagB element, it would be: <xsl:template match="TagB"> <TagB> <xsl:apply-templates select="@*[1]" /> </TagB> </xsl:template> I hope that's closer to what you were after. 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] (consistency in select re, Edward . Middleton | Thread | RE: [xsl] (consistency in select re, Edward . Middleton |
Re: [xsl] cannot assign val to sort, Thomas B. Passin | Date | [xsl] Parsing mixed content nodes, Jason Macki |
Month |