Subject: Re: [xsl] Issue with repetition of elements in the input XML From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx> Date: Tue, 27 Nov 2007 22:12:46 +0530 |
I am glad that finally you are able to work out a solution. I would also go with David's advice. If you are able to use XSLT 2.0, I would strongly suggest, please use XSLT 2.0. It's now a W3C Recommendation, and there are stable 2.0 implementations existing. If there is no choice but to use XSLT 1.0, please let me know, and I can try to convert the solution to 1.0. On 11/27/07, lakshmi mrudula <mrudula_lakshmi@xxxxxxxxx> wrote: > Hi, > > With one more if condition to below approach its > working fine. > > THanks for your solution. > > Here is the XSL. > > <?xml version="1.0" encoding="utf-8"?> > <xsl:stylesheet > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > version="2.0"> > > <xsl:output method="xml" indent="yes"/> > > <xsl:variable name="controlInfo"> > <CompanyId/> > <ReservationControlNumber/> > <ReservationControlType/> > <FirstDate/> > <Time/> > </xsl:variable> > > <xsl:template match="/root"> > <root> > <RCI> > <xsl:for-each-group > select="ReservationControlInformationSegment/*" > group-starting-with="CompanyId"> > > <xsl:variable > name="aReservationControlInformation">RCI<xsl:number > value="position()" format="01"/></xsl:variable> > <xsl:element > name="{$aReservationControlInformation}"> > <xsl:for-each select="$controlInfo/*"> > <xsl:variable > name="aReservationControlInformationNew"> > <xsl:value-of > select="$aReservationControlInformation"/> > <xsl:number value="position()" format="01"/> > </xsl:variable> > <xsl:if test="current-group()[local-name() = > local-name(current())]"> > <xsl:element > name="{$aReservationControlInformationNew}"> > <xsl:value-of > select="current-group()[local-name() = > local-name(current())]"/> > </xsl:element> > </xsl:if> > </xsl:for-each> > </xsl:element> > </xsl:for-each-group> > </RCI> > </root> > </xsl:template> > </xsl:stylesheet> > > > When we tried this XSL with StylusStudio its able to > convert the input XML. But with eclipse its not > working. This is because we are using XSLT 1.0 and > for-each-group is not defined for that. Can you please > provide us the solution in XSLT 1.0. What will be the > equivalent of for-each-group. > > --- Mukul Gandhi <gandhi.mukul@xxxxxxxxx> wrote: > > > Please try this: > > > > <?xml version="1.0" encoding="UTF-8"?> > > <xsl:stylesheet > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > > version="2.0"> > > > > <xsl:output method="xml" indent="yes" /> > > > > <xsl:variable name="controlInfo"> > > <CompanyId/> > > <ReservationControlNumber/> > > <ReservationControlType/> > > <FirstDate/> > > <Time/> > > </xsl:variable> > > > > <xsl:template match="/root"> > > <root> > > <RCI> > > <xsl:for-each-group > > select="ReservationControlInformationSegment/*" > > group-starting-with="CompanyId"> > > > > <xsl:variable > > name="aReservationControlInformation">RCI<xsl:number > > value="position()" > > format="01"/> > > </xsl:variable> > > <xsl:element > > name="{$aReservationControlInformation}"> > > <xsl:for-each select="$controlInfo/*"> > > <xsl:variable > > name="aReservationControlInformationNew"> > > <xsl:value-of > > select="$aReservationControlInformation" > > /><xsl:number > > value="position()" > > format="01"/> > > </xsl:variable> > > <xsl:element > > name="{$aReservationControlInformationNew}"> > > <xsl:value-of > > select="current-group()[local-name() = > > local-name(current())]" /> > > </xsl:element> > > </xsl:for-each> > > </xsl:element> > > </xsl:for-each-group> > > </RCI> > > </root> > > </xsl:template> > > > > </xsl:stylesheet> > > > > On Nov 23, 2007 10:57 AM, lakshmi mrudula > > <mrudula_lakshmi@xxxxxxxxx> wrote: > > > Hi, > > > > > > Thanks for your solution. > > > But with XSL logic below, > > > If input XML is as shown below: > > > > > > <?xml version="1.0"?> > > > <root> > > > <ReservationControlInformationSegment> > > > <CompanyId>AAH</CompanyId> > > > > > > > > > <ReservationControlNumber>ABC12345</ReservationControlNumber> > > > > > <ReservationControlType>A</ReservationControlType> > > > <FirstDate>11OCT2007</FirstDate> > > > <Time>1230</Time> > > > <CompanyId>AAA</CompanyId> > > > > > > > > <ReservationControlType>B</ReservationControlType> > > > <FirstDate>11OCT2007</FirstDate> > > > <Time>1130</Time> > > > </ReservationControlInformationSegment> > > > </root> > > > > > > Then Expected output will be: > > > > > > <?xml version='1.0' ?> > > > <root> > > > <RCI> > > > <RCI01> > > > <RCI0101>AAH</RCI0101> > > > <RCI0102>ABC12345</RCI0102> > > > <RCI0103>A</RCI0103> > > > <RCI0104>11OCT2007</RCI0104> > > > <RCI0105>1230</RCI0105> > > > </RCI01> > > > <RCI02> > > > <RCI0201>AAA</RCI0201> > > > <RCI0202/> > > > <RCI0203>B</RCI0203> > > > <RCI0204>11OCT2007</RCI0204> > > > <RCI0205>1130</RCI0205> > > > </RCI02> > > > </RCI> > > > </root> > > > > > > But the actual output is coming with the given XSL > > as > > > below: > > > > > > <?xml version='1.0' ?> > > > <root> > > > <RCI> > > > <RCI01> > > > <RCI0101>AAH</RCI0101> > > > <RCI0102>ABC12345</RCI0102> > > > <RCI0103>A</RCI0103> > > > <RCI0104>11OCT2007</RCI0104> > > > <RCI0105>1230</RCI0105> > > > </RCI01> > > > <RCI02> > > > <RCI0201>AAA</RCI0201> > > > <RCI0202>B</RCI0202> > > > <RCI0203>11OCT2007</RCI0203> > > > <RCI0204>1130</RCI0204> > > > </RCI02> > > > </RCI> > > > </root> > > > > > > > > > Our requirement for the output is: > > > > > > If any information is missing in the middle then > > > empty > > > tag should be there. > > > But if it is missing at the end, then empty tags > > need > > > not be there in the output. > > > > > > In input XML, elements will be in the same order. > > > None > > > of the elements are mandatory. > > > Any of the elements can be missed in the input > > XML. > > > > > > For this requirement we need solution. > > > > > > > > > > > > > > > --- Mukul Gandhi <gandhi.mukul@xxxxxxxxx> wrote: > > > > > > > This problem is easily solved with the XSLT 2.0 > > > > grouping construct. > > > > Please refer to the solution below: > > > > > > > > <?xml version="1.0" encoding="UTF-8"?> > > > > <xsl:stylesheet > > > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > > > > version="2.0"> > > > > > > > > <xsl:output method="xml" indent="yes" /> > > > > > > > > <xsl:template match="/root"> > > > > <root> > > > > <RCI> > > > > <xsl:for-each-group > > > > select="ReservationControlInformationSegment/*" > > > > group-starting-with="CompanyId"> > > > > <xsl:variable > > > > > > name="aReservationControlInformation">RCI<xsl:number > > > > value="position()" > > > > format="01"/> > > > > </xsl:variable> > > > > <xsl:element > > > > name="{$aReservationControlInformation}"> > > > > <xsl:for-each > > select="current-group()"> > > > > <xsl:variable > > > > name="aReservationControlInformationNew"> > > > > <xsl:value-of > > > > select="$aReservationControlInformation" > > > > /><xsl:number > > > > value="position()" > > > > format="01"/> > > > > </xsl:variable> > > > > <xsl:element > > > > name="{$aReservationControlInformationNew}"> > > > > <xsl:value-of select="." /> > > > > </xsl:element> > > > > </xsl:for-each> > > > > </xsl:element> > > > > </xsl:for-each-group> > > > > </RCI> > > > > </root> > > > > </xsl:template> > > > > > > > > </xsl:stylesheet> -- Regards, Mukul Gandhi
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Issue with repetition of , lakshmi mrudula | Thread | Re: [xsl] Issue with repetition of , lakshmi mrudula |
Re: [xsl] Converting a string to Up, Andrew Welch | Date | Re: [xsl] Converting a string to Up, Wendell Piez |
Month |