![]() |
![]() | ![]() | ![]() | Altova Mailing List Archives>Archive Index >microsoft.public.xsl Archive Home >Recent entries >Thread Prev - Transform help required [Thread Next] Re: Transform help requiredTo: NULL Date: 6/1/2008 9:55:00 AM
"chris f" <chrisfellows@n...> wrote in message
news:#9WIDp7wIHA.1772@T......
> Can someone help me with the XSL to transform my XML document. The input
> document's Record element can contain any number of paired Name[N] &
> Value[N] elements where N starts at 1 and is incremented by 1 for each
> subsequent pair of elements.
>
> Input:
> <Records>
> <Record>
> <Id>1</Id>
> <Name1>SomeName10</Name1>
> <Value1>SomeValue15</Value1>
> <Name2>SomeName20</Name2>
> <Value2>SomeValue25</Value2>
> </Record>
> <Record>
> <Id>2</Id>
> ...
> </Record>
> </Records>
>
> Output:
> <MyRecords>
> <MyRecord>
> <Id>1</Id>
> <Items>
> <Item name="SomeName10" value="SomeValue15"/>
> <Item name="SomeName20" value="SomeValue25"/>
> </Items>
> </MyRecord>
> <MyRecord>
> <Id>2</Id>
> ...etc
> </MyRecord>
> </MyRecords>
>
>
I think this stylesheet does the job:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<MyRecords>
<xsl:apply-templates select="Records/Record" />
</MyRecords>
</xsl:template>
<xsl:template match="Record">
<MyRecord>
<xsl:copy-of select="Id"/>
<Items>
<xsl:apply-templates select="*[starts-with(local-name(), 'Name')]"
/>
</Items>
</MyRecord>
</xsl:template>
<xsl:template match="*">
<Item name="{.}" value="{following-sibling::*[1]}" />
</xsl:template>
</xsl:stylesheet>
The original XML has a terrible structure, using a suffix on an element name
always causes problems when processing, much better to have the same name
with an attribute signifying the order:
<Name position="1">...</Name>
--
Joe Fawcett (MVP - XML)
http://joe.fawcett.name
| ![]() | ![]() | ![]() |
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | |||||
|
