|
Subject: Re: [xsl] XSLT recursion problem From: "M. David Peterson" <m.david.x2x2x@xxxxxxxxx> Date: Wed, 28 Sep 2005 03:39:16 -0600 |
You can:
In XSLT 1.0 this:
<?xml version="1.0" encoding="UTF-8"?>
<ax:repeat xmlns:ax="uri:axnamespace">
<sometag>
<ax:items element="txt">
<ax:item src="txt1.txt"/>
<ax:item src="txt2.txt"/>
</ax:items>
<ax:items element="img">
<ax:item src="img1.jpg"/>
<ax:item src="img2.jpg"/>
</ax:items>
</sometag>
</ax:repeat>
Processed by this:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ax="uri:axnamespace"
version="1.0">
<xsl:template match="/">
<xsl:apply-templates select="ax:repeat/*" mode="initial"/>
</xsl:template>
<xsl:template match="*" mode="initial">
<xsl:apply-templates select="*" mode="universal">
<xsl:with-param name="name" select="name()"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="*" mode="universal">
<xsl:param name="name"/>
<xsl:variable name="position" select="position()"/>
<xsl:element name="{$name}">
<xsl:apply-templates select="../*/*[position() =
$position]" mode="parent">
<xsl:with-param name="name" select="@element"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="*" mode="parent">
<xsl:param name="name"/>
<xsl:param name="parentName"/>
<xsl:element name="{$parentName}">
<xsl:apply-templates select="." mode="child">
<xsl:with-param name="name" select="$name"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="*" mode="child">
<xsl:param name="name"/>
<xsl:element name="{$name}">
<xsl:copy-of select="@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
=
<?xml version="1.0" encoding="utf-8"?>
<sometag>
<txt src="txt1.txt"/>
<txt src="img1.jpg"/>
</sometag>
<sometag>
<img src="txt2.txt"/>
<img src="img2.jpg"/>
</sometag>
This relies on the idea the child count and the parent count being
exactly the same. Theres a way to write so this isn't the case but if
we gave you all the answers you wouldnt have any fun :)
As such, have fun :)
On 9/28/05, Ragulf Pickaxe <ragulf.pickaxe@xxxxxxxxx> wrote:
> > The real problem is that I don't want to have to know anything about
> > <sometag>. That is, I would be free to use (and nest!) whatever
> > non-proprietary tag inside my <repeat>, without modifing it.
> > Probably there's no way in XSLT 1.0 (if it is, why creating tunnel in
> > 2.0 ;) , but if you see another solution...
> >
>
> Hi again Paolo,
>
> Why can you not have a general template for the "Sometag" and other
> elements that you just want to pass on?
>
> I think that your own solution would be able to provide, if you change
> the template that matches "Sometag" to the following:
>
> <xsl:template match="*">
> <xsl:param name="index" select="1"/>
> <xsl:copy>
> <xsl:copy-of select="@*"/>
> <xsl:apply-templates>
> <xsl:with-param name="index" select="$index"/>
> </xsl:apply-templates>
> <!-- sometag content -->
> </xsl:copy>
> </xsl:template>
>
> The match="ax:items" is more specific than match="*" and thus has
> higher priority.
>
> My solution, I think, you would have to change three templates:
>
> <xsl:template match="ax:repeat">
> <xsl:apply-templates/> <!-- instead of <xsl:apply-templates
> select="sometag"/>-->
> </xsl:template>
>
> <xsl:template match="*"> <!-- Instead of <xsl:template match="sometag" -->
> <xsl:copy> <!-- Copy element (shallow copy) -->
> <xsl:copy-of select="@*"/> <!-- Copy all attributes -->
> <!-- other non-proprietary elements to be processed: -->
> <xsl:apply-templates select="*[not(self::ax:items)]"/>
> <!-- Propriotary elements to be processed: -->
> <xsl:apply-templates select="ax:items[1]" mode="first"/>
> </xsl:copy>
> </xsl:template>
>
> And remove the <sometag> and </sometag>from the
> <xsl:template match="ax:items" mode="first">
> ..
> </
>
>
> Is this what you need?
>
> Regards,
> Ragulf Pickaxe :-)
>
>
--
<M:D/>
M. David Peterson
http://www.xsltblog.com
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] XSLT recursion problem, Ragulf Pickaxe | Thread | Re: [xsl] XSLT recursion problem, M. David Peterson |
| RE: [xsl] more xsl:number confusion, Michael Kay | Date | Re: [xsl] XSLT recursion problem, M. David Peterson |
| Month |