|
next
|
Subject: XSL logic issue for simple input xml. Please help. This is reply to the solution suggested. Author: amith swamy Date: 16 Nov 2007 04:13 AM
|
Hi,
We have the below issue in XSL logic. We didnt get the reply for our previous issue and hence we are uploading this as a seperate new issue.
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>ABC456789</ReservationControlNumber>
<CompanyId>AAH</CompanyId>
<ReservationControlNumber>ABC456789</ReservationControlNumber>
<ReservationControlType>B</ReservationControlType>
</ReservationControlInformationSegment>
</root>
The expected output XML is
<root>
<RCI>
<RCI01>
<RCI0101>AAH</RCI0101>
<RCI0102>ABC456789</RCI0102>
</RCI01>
<RCI02>
<RCI0201>AAH</RCI0201>
<RCI0202>ABC456789</RCI0202>
<RCI0203>B</RCI0203>
</RCI02>
</RCI>
</root>
The XSL used is as shown below which was suggested in the XSLT forum
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:key name="Company" match="*[not(name() = 'CompanyId')]" use="generate-id(preceding-sibling::CompanyId[1])"/>
<xsl:template match="/root">
<root>
<RCI>
<xsl:for-each select="ReservationControlInformationSegment/CompanyId">
<xsl:variable name="PositionCount" select="position()"/>
<xsl:variable name="aReservationControlInformation">RCI<xsl:number value="$PositionCount" format="01"/>
</xsl:variable>
<xsl:variable name="aCompanyId"><xsl:value-of select="$aReservationControlInformation"/>01</xsl:variable>
<xsl:element name="{$aReservationControlInformation}">
<xsl:element name="{$aCompanyId}"><xsl:value-of select="."/></xsl:element>
<xsl:for-each select="key('Company', generate-id(.))">
<xsl:variable name="elementId"><xsl:value-of select="$aReservationControlInformation"/><xsl:number value="1+position()" format="01"/></xsl:variable>
<xsl:element name="{$elementId}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</RCI>
</root>
</xsl:template>
</xsl:stylesheet>
The above issue worked, but new problem is, if CompanyId tag is only not there, then all the other elements till the next CompanyId will not come in the output.
For ex:
<root>
<ReservationControlInformationSegment>
<ReservationControlNumber>ABC456789</ReservationControlNumber>
<CompanyId>AAA</CompanyId>
<ReservationControlNumber>ABC12345</ReservationControlNumber>
<ReservationControlType>B</ReservationControlType>
</ReservationControlInformationSegment>
</root>
And the o/p will be:
<RCI>
<RCI01>
<RCI0101>AAA</RCI0101>
<RCI0102>ABC12345</RCI0102>
<RCI0103>B</RCI0103>
</RCI01>
</RCI>
And suppose if any of the elements in the middle are missing
For Ex:
<?xml version="1.0"?>
<root>
<ReservationControlInformationSegment>
<CompanyId>AAH</CompanyId>
<ReservationControlNumber>ABC456789</ReservationControlNumber>
<CompanyId>AAA</CompanyId>
<ReservationControlType>B</ReservationControlType>
</ReservationControlInformationSegment>
</root>
In the above example, ReservationControlNumber before ReservationControlType is missing.
Then output will be:
<RCI>
<RCI01>
<RCI0101>AAH</RCI0101>
<RCI0102>ABC456789</RCI0102>
</RCI01>
<RCI02>
<RCI0201>AAA</RCI0201>
<RCI0202>B</RCI0202>
</RCI02>
</RCI>
In the output, in place of ReservationControlNumber, ReservationControlType information will be replaced.
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.
For ex:
If four elements should be there in RCI01 and last 2 elements are not present, then empty tags for those 2 elements should not come. But if 2 middle elements are missing then first element should come and middle two elements should come with an empty tag and last element information should be there.
In the above example,
Proper output should be as follows:
<RCI>
<RCI01>
<RCI0101>AAH</RCI0101>
<RCI0102>ABC456789</RCI0102>
</RCI01>
<RCI02>
<RCI0201>AAA</RCI0201>
</RCI0202>
<RCI0203>B </RCI0203>
</RCI02>
</RCI>
|
|
|
|