Re: [xsl] Issue with repetition of elements in the input XML

Subject: Re: [xsl] Issue with repetition of elements in the input XML
From: lakshmi mrudula <mrudula_lakshmi@xxxxxxxxx>
Date: Thu, 29 Nov 2007 01:30:32 +1300 (NZDT)
Hi Mukul,

Thanks for the updates. This worked for us. But this
is in 2.0. Can you please provide us the solution in
1.0?

I saw Muenchian Method also.

But for that input XML is in different format.

So for our input requirement can you please give the
same solution in 1.0.

I tried for
http://gandhimukul.tripod.com/grouping.html
also. This site is not opening only.

AS we are pretty new to XSLs please help us in solving
this issue.


--- 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 ===


Send instant messages to your online friends http://au.messenger.yahoo.com 

Current Thread