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

Subject: Re: [xsl] Issue with repetition of elements in the input XML
From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx>
Date: Fri, 23 Nov 2007 12:00:02 +0530
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

Current Thread