[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Issue with repetition of elements in the input XML
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> > > > > On Nov 22, 2007 3:05 PM, lakshmi mrudula > > <mrudula_lakshmi@xxxxxxxxx> wrote: > > > Hi, > > > > > > We have the below issue in XSL logic. Can you > > please > > > provide us better approach to solve the issue? > > > Issue is mentioned below. > > > > > > If input XML has same elements that is repeating > > twice > > > and should be mapped to the same element in the > > output > > > XML. > > > > > > For Ex : > > > > > > If input XML is, > > > > > > <?xml version="1.0"?> > > > <root> > > > <ReservationControlInformationSegment> > > > <CompanyId>AAH</CompanyId> > > > > > > <ReservationControlNumber>ABC12345</ReservationControlNumber> > > > <ReservationControlType>A</ReservationControlType> > > > <FirstDate>11OCT2007< /FirstDate> > > > <Time>1230</Time> > > > <CompanyId>AAA</CompanyId> > > > > > > <ReservationControlNumber>ABC456739</ReservationControlNumber> > > > <ReservationControlType>B</ReservationControlType> > > > <FirstDate>11OCT2007< /FirstDate> > > > > > > <Time>1130</Time></ReservationControlInformationSegment> > > > </root> > > > > > > > > > The expected output XML is > > > > > > <root> > > > <RCI> > > > <RCI01> > > > <RCI0101>AAH</RCI0101> > > > <RCI0102> ABC12345</RCI0102> > > > <RCI0103>A</RCI0103> > > > <RCI0104>11OCT2007</RCI0104> > > > <RCI0105>1230</RCI0105> > > > </RCI01> > > > <RCI02> > > > <RCI0201>AAA</RCI0201> > > > <RCI0202>ABC456739</RCI0102> > > > <RCI0203>B</RCI0103> > > > <RCI0204>11OCT2007</RCI0104> > > > <RCI0205>1130</RCI0105> > > > </RCI02> > > > </RCI> > > > </root> > > > > > > The XSL used is as shown below > > > > > > <RCI> > > > <xsl:for-each > > > > > > select="root/ReservationControlInformationSegment/CompanyId"> > > > <xsl:variable name="PositionCount" > > > select="position()"/> > > > <xsl:variable name="this" > > select="generate-id(.)"/> > > > <xsl:variable name="next" > > > > > > select="generate-id(following-sibling::ReservationControlNumber[1]/preceding-sibling::CompanyId[1])"/> > > > <xsl:variable name="reservationcontrolnumber"> > > > <xsl:if test="$this = $next"> > > > <xsl:value-of > > > > > > select="following-sibling::ReservationControlNumber[1]"/> > > > </xsl:if> > > > </xsl:variable> > > > <xsl:variable name="next1" > > > > > > select="generate-id(following-sibling::ReservationControlType[1]/preceding-sibling::CompanyId[1])"/> > > > <xsl:variable name="reservationcontroltype"> > > > <xsl:if test="$this = $next1"> > > > <xsl:value-of > > > > > > select="following-sibling::ReservationControlType[1]"/> > > > </xsl:if> > > > </xsl:variable> > > > <xsl:variable name="next2" > > > > > > select="generate-id(following-sibling::FirstDate[1]/preceding-sibling::CompanyId[1])"/> > > > <xsl:variable name="firstdate"> > > > <xsl:if test="$this = $next2"> > > > <xsl:value-of > > > select="following-sibling::FirstDate[1]"/> > > > </xsl:if> > > > </xsl:variable> > > > <xsl:variable name="next3" > > > > > > select="generate-id(following-sibling::Time[1]/preceding-sibling::CompanyId[1])"/> > > > <xsl:variable name="time"> > > > <xsl:if test="$this = $next3"> > > > <xsl:value-of > > select="following-sibling::Time[1]"/> > > > </xsl:if> > > > </xsl:variable> > > > <xsl:variable > > > > > name="aReservationControlInformation">RCI<xsl:number > > > value="position()" format="01"/></xsl:variable> > > > <xsl:element > > name="{$aReservationControlInformation}"> > > > <xsl:variable name="aCompanyId">RCI<xsl:number > > > value="position()" format="01"/>01</xsl:variable> > > > <xsl:element name="{$aCompanyId}"> > > > <xsl:value-of select="."/> > > > </xsl:element> > > > <xsl:variable > > > name="aReservationControlNumber">RCI<xsl:number > > > value="position()" format="01"/>02</xsl:variable> > > > <xsl:element name="{$aReservationControlNumber}"> > > > <xsl:value-of select="$reservationcontrolnumber"/> > > > </xsl:element> > > > <xsl:variable > > > name="aReservationControlType">RCI<xsl:number > > > value="position()" format="01"/>03</xsl:variable> > > > <xsl:if > > > > > > test="following-sibling::ReservationControlType[1][normalize-space()]"> > > > <xsl:element name="{$aReservationControlType}"> > > > <xsl:value-of select="$reservationcontroltype"/> > > > </xsl:element> > > > </xsl:if> > > > <xsl:variable name="aFirstDate">RCI<xsl:number > > > value="position()" format="01"/>04</xsl:variable> > > > <xsl:if > > > > > > test="following-sibling::FirstDate[1][normalize-space()]"> > > > <xsl:element name="{$aFirstDate}"> > > > <xsl:value-of select="$firstdate"/> > > > </xsl:element> > > > </xsl:if> > > > <xsl:variable name="aTime">RCI<xsl:number > > > value="position()" format="01"/>05</xsl:variable> > > > <xsl:if > > > > > > test="following-sibling::Time[1][normalize-space()]"> > > > <xsl:element name="{$aTime}"> > > > <xsl:value-of select="$time"/> > > > </xsl:element> > > > </xsl:if> > > > </xsl:element> > > > </xsl:for-each> > > > </RCI> > > > === message truncated === -- Regards, Mukul Gandhi
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|