Subject: Re: [xsl] flat XML to normal XML From: Borut Bolčina <bob@xxxxxxxx> Date: Mon, 16 May 2005 17:02:31 +0200 |
Borut, hi, sorry to be tedious, but I couldn't walk away...here's input XML (extended with motorcycles, in restitution)
<DataSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Table> <Level>1</Level> <Description>Cars</Description> </Table> <Table> <Level>2</Level> <Description>BMW</Description> </Table> <Table> <Level>3</Level> <Description>316</Description> </Table> <Table> <Level>3</Level> <Description>Z4</Description> </Table> <Table> <Level>2</Level> <Description>Citroen</Description> </Table> <Table> <Level>3</Level> <Description>C2</Description> </Table> <Table> <Level>3</Level> <Description>C4 coupe</Description> </Table> <Table> <Level>2</Level> <Description>Alfa Romeo</Description> </Table> <Table> <Level>3</Level> <Description>156</Description> </Table> <Table> <Level>1</Level> <Description>Motorcycles</Description> </Table> <Table> <Level>2</Level> <Description>Kawasaki</Description> </Table> <Table> <Level>3</Level> <Description>Ninja</Description> </Table> <Table> <Level>2</Level> <Description>Suzuki</Description> </Table> <Table> <Level>3</Level> <Description>Katana</Description> </Table> </DataSet>
The new XSL (not pretty yet):
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" omit-xml-declaration="yes"/>
<xsl:template match="/">
<NewDataSet>
<xsl:for-each select="DataSet/Table[Level = 1]">
<xsl:variable name="t" select="."/>
<Transport name="{Description}">
<xsl:for-each select="following-sibling::Table[
Level = 2
and (
(. = current()/following-sibling::Table[Level = 1][1]/preceding-sibling::Table)
or ($t = ./preceding-sibling::Table[Level = 1][1])
)
]">
<xsl:variable name="b" select="."/>
<Brand name="{Description}">
<xsl:for-each select="following-sibling::Table[
Level = 3
and (
. = current()/following-sibling::Table[Level = 2][1]/preceding-sibling::Table
or ($b = ./preceding-sibling::Table[Level = 2][1])
)
]">
<Model name="{Description}">
</Model>
</xsl:for-each>
</Brand>
</xsl:for-each>
</Transport>
</xsl:for-each>
</NewDataSet>
</xsl:template>
</xsl:stylesheet>
And the resulting output:
<NewDataSet> <Transport name="Cars"> <Brand name="BMW"> <Model name="316"/> <Model name="Z4"/> </Brand> <Brand name="Citroen"> <Model name="C2"/> <Model name="C4 coupe"/> </Brand> <Brand name="Alfa Romeo"> <Model name="156"/> </Brand> </Transport> <Transport name="Motorcycles"> <Brand name="Kawasaki"> <Model name="Ninja"/> </Brand> <Brand name="Suzuki"> <Model name="Katana"/> </Brand> </Transport> </NewDataSet>
If I find even this to be incorrect I'll let people more immediately capable than I respond to you.
Regards,
--A
_________________________________________________________________
On the road to retirement? Check out MSN Life Events for advice on how to get there! http://lifeevents.msn.com/category.aspx?cid=Retirement
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] flat XML to normal XML, Aron Bock | Thread | RE: [xsl] flat XML to normal XML, Aron Bock |
Re: [xsl] end-tag minimization prob, David Carlisle | Date | RE: [xsl] flat XML to normal XML, Aron Bock |
Month |