Why do I bother giving you a design when someone else gives you the code
and tests it?
Sigh.
Michael Kay
-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of
Dimitre Novatchev
Sent: 29 September 2003 15:23
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] restructuring element hierarchy using xslt
This transformation:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="Digits" select="1234567890"/>
<xsl:template match="/*">
<t>
<xsl:apply-templates
select="het[not(contains(@position, '.'))]"/>
</t>
</xsl:template>
<xsl:template match="het">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates
select="../het[starts-with(@position, current()/@position)
and
string-length(translate(@position,
$Digits,
''
)
)
=
1 +
string-length(translate(current()/@position,
$Digits,
''
)
)
]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
When applied to your source.xml:
<t>
<het position="1"></het>
<het position="1.1"></het>
<het position="1.1.1"></het>
<het position="1.1.2"></het>
<het position="1.2"></het>
<het position="1.2.1"></het>
<het position="2"></het>
<het position="2.1"></het>
<het position="2.1.1"></het>
</t>
produces the wanted result:
<t>
<het position="1">
<het position="1.1">
<het position="1.1.1"/>
<het position="1.1.2"/>
</het>
<het position="1.2">
<het position="1.2.1"/>
</het>
</het>
<het position="2">
<het position="2.1">
<het position="2.1.1"/>
</het>
</het>
</t>
=====
Cheers,
Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL
I have an xml document like this:
<het position="1"></het>
<het position="1.1"></het>
<het position="1.1.1"></het>
<het position="1.1.2"></het>
<het position="1.2"></het>
<het position="1.2.1"></het>
<het position="2"></het>
<het position="2.1"></het>
<het position="2.1.1"></het>
and i was trying to get it to look like this:
<het position="1">
<het position="1.1">
<het position="1.1.1">
</het>
<het position="1.1.2">
</het>
</het>
<het position="1.2">
<het position="1.2.1">
</het>
</het>
</het>
<het position="2">
<het position="2.1">
<het position="2.1.1">
</het>
</het>
</het>
In other words make it nested. I can get the first set of elements
out
by doing a contains() function in a predicate (<xsl:template
match="het[contains(@position, '.')=false]">) but i am
having a problem
with template matching, i know i can't put a template match
within a
template match and this is causing me a bit of trouble.
__________________________________
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
http://shopping.yahoo.com
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list