Link to home
Start Free TrialLog in
Avatar of ube100
ube100Flag for United Kingdom of Great Britain and Northern Ireland

asked on

xsl problem

Hi,

This xsl file is producing the wrong output when I get this xml source. ( both files are attached)

This XSL should produced this:

<Anteeo xmlns:ota="http://www.opentravel.org/OTA/2003/05">
  <table name="STATUS" service="">
    <Error AnteeoReason="There was an error retrieving availability." ErrorCode="" ErrorText="" ErrorText2="" Code="" AppErrorSeverityLevel="" QuickIndicator="N" />
  </table>
</Anteeo>

instead of this for this source XML:

<Anteeo xmlns:ota="http://www.opentravel.org/OTA/2003/05">
  <table name="STATUS" service="">
    <Error AnteeoReason="All OK." ErrorCode="" ErrorText="" ErrorText2="" Code="" AppErrorSeverityLevel="" QuickIndicator="Y" />
  </table>
</Anteeo>
AvailResponse.xml
SourceXML.xml
Avatar of arevuri
arevuri
Flag of India image

Looks like your source xml falls into the .//ota.Success and some issue in <xsl:when test="(.//Errors/Error[@Code != ''])">
 
try removing         | .//ota:Success in your xls, so that you may get clue of the issue
Avatar of ube100

ASKER

Actually that source XML should be:

<OTA_HotelAvailRS TimeStamp="2009-12-20T22:09:05" xmlns="http://www.opentravel.org/OTA/2003/05">
  <Success />
  <Warning>
    <Warning Code="75205" ShortText="No availability found for this request" />
  </Warning>
</OTA_HotelAvailRS>
This is warning message but comes as a success so we will have to handle that as a error message and notifiy the user accordingly.
Avatar of Gertone (Geert Bormans)
The issue is that Error is in the ota namespace, and you are testing outside that namespace

I added a corrected stylesheet.

The annoying thing is that we are running in circles with your stylesheets.
First they don't work because the Success and Errors are outside the namespace, then we change that, then they are in the namespace again, a bit confusing.
The webservice you are pulling this from seems highly unreliable.
Or are you hand making these example?
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:ota="http://www.opentravel.org/OTA/2003/05"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:output indent="yes"/>
	<xsl:strip-space elements="*"/>
	<xsl:param name="service" select="''" />
	<xsl:param name="trans" select="''" />
	<xsl:output method="xml" omit-xml-declaration="yes"/>
	<xsl:template match="/">
		<Anteeo>
			<table name="STATUS" service="{$service}">
				<!-- All error records should follow this format. If they don't change the format for  
                                all error messages. -->
				<xsl:choose>
					<xsl:when test="(.//ota:Errors/ota:Error[@Code != ''])">
						<Error
								AnteeoReason="There was an error retrieving availability."
								ErrorCode="{.//ota:Errors/ota:Error/@Code}"
								ErrorText="{.//ota:Errors/ota:Error/@ShortText}"
								ErrorText2=""
								Code=""
								AppErrorSeverityLevel=""
								QuickIndicator="N"
                                                />
					</xsl:when>
					<xsl:when test="(.//ota:Errors/ota:Error[@Code = '']) | .//ota:Success">
						<Error
								AnteeoReason="All OK."
								ErrorCode=""
								ErrorText=""
								ErrorText2=""
								Code=""
								AppErrorSeverityLevel=""
								QuickIndicator="Y"
                                                />
					</xsl:when>
				</xsl:choose>

			</table>
			<xsl:apply-templates select=".//ota:OTA_HotelAvailRS/ota:RoomStays"/>
		</Anteeo>

	</xsl:template>

	<!--  
        <xsl:template match="ota:Errors"> 
                <Error 
                        AnteeoReason="There was an error retrieving availability." 
                        ErrorCode="{/Error/Code}" 
                        ErrorText="{//Error/ShortText}" 
                        ErrorText2="" 
                        Code="{/Error/Code}" 
                        AppErrorSeverityLevel="" 
                        QuickIndicator="N" 
                                /> 
        </xsl:template> 
 
        <xsl:template match="message"> 
                <xsl:apply-templates /> 
        </xsl:template>         -->

	<xsl:template match="alternatelistseg">
		<table name="HotelAvail" service="{$service}">
			<xsl:apply-templates />
		</table>
	</xsl:template>
	<!--    <xsl:template match="/"> 
                <xsl:apply-templates select="ota:OTA_HotelAvailRS/ota:RoomStays"/> 
        </xsl:template> 
-->
	<xsl:template match="ota:RoomStays">
		<table name="HotelAvail" service="">
			<xsl:apply-templates select="ota:RoomStay"/>
		</table>
	</xsl:template>
	<xsl:template match="ota:TimeSpan">
		<xsl:attribute name="TimeStart">
			<xsl:value-of select="@Start"/>
		</xsl:attribute>
		<xsl:attribute name="TimeDuration">
			<xsl:value-of select="@Duration"/>
		</xsl:attribute>
	</xsl:template>
	<xsl:template match="ota:Total">
		<xsl:attribute name="AmountAfterTax">
			<xsl:value-of select="@AmountAfterTax"/>
		</xsl:attribute>
		<!-- 09/12/2009 <xsl:attribute name="TimeDuration"> 
                        <xsl:value-of select="@Duration"/> 
                </xsl:attribute>                -->
	</xsl:template>
	<xsl:template match="ota:ResGuestRPHs">
		<xsl:for-each select="ota:ResGuestRPH">
			<xsl:attribute name="ResGuestRPH-{position()}">
				<xsl:value-of select="@RPH"/>
			</xsl:attribute>
		</xsl:for-each>
	</xsl:template>
	<xsl:template match="ota:RoomRates">
		<xsl:for-each select="ota:RoomRate">
			<xsl:attribute name="RoomRate-{position()}">
				<xsl:value-of select="@RatePlanCode"/>
			</xsl:attribute>
		</xsl:for-each>
	</xsl:template>
	<xsl:template match="ota:BasicPropertyInfo">
		<xsl:attribute name="ID">
			<xsl:value-of select="@HotelCodeContext"/>
		</xsl:attribute>
		<xsl:attribute name="VendorMessage">
			<xsl:value-of select="ota:VendorMessages"/>
		</xsl:attribute>
	</xsl:template>
	<xsl:template match="ota:CancelPenalties">
		<xsl:for-each select="ota:CancelPenalty">
			<xsl:attribute name="CancelPenalty-{position()}">
				<xsl:value-of select="ota:Deadline/@OffsetUnitMultiplier"/>
			</xsl:attribute>
		</xsl:for-each>
	</xsl:template>
	<xsl:template match="ota:RoomStay">
		<xsl:element name="AvailHtl">
			<xsl:attribute name="MaxOccupancy"></xsl:attribute>
			<xsl:attribute name="Minoccupancy"></xsl:attribute>
			<xsl:apply-templates select="*"/>
		</xsl:element>
	</xsl:template>

</xsl:stylesheet>

Open in new window

You could ofcourse, if you are uncertain about the nemaspace,
make the XPaths namespace agnostic
So we are done with all these issues
<xsl:choose>
					<xsl:when test="/*[local-name() = 'OTA_HotelAvailRS']/*[local-name() = 'Errors']/*[local-name() = 'Error'][@Code != '']">
						<Error
								AnteeoReason="There was an error retrieving availability."
								ErrorCode="{.//ota:Errors/ota:Error/@Code}"
								ErrorText="{.//ota:Errors/ota:Error/@ShortText}"
								ErrorText2=""
								Code=""
								AppErrorSeverityLevel=""
								QuickIndicator="N"
                                                />
					</xsl:when>
					<xsl:when test="/*[local-name() = 'OTA_HotelAvailRS']/*[local-name() = 'Errors']/*[local-name() = 'Error'][@Code != ''] | /ota:OTA_HotelAvailRS/*[local-name() = 'Success']">
						<Error
								AnteeoReason="All OK."
								ErrorCode=""
								ErrorText=""
								ErrorText2=""
								Code=""
								AppErrorSeverityLevel=""
								QuickIndicator="Y"
                                                />
					</xsl:when>
				</xsl:choose>

Open in new window

Oh, I did not see your follow up on Warning
I added Warning to the choose
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:ota="http://www.opentravel.org/OTA/2003/05"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:output indent="yes"/>
	<xsl:strip-space elements="*"/>
	<xsl:param name="service" select="''" />
	<xsl:param name="trans" select="''" />
	<xsl:output method="xml" omit-xml-declaration="yes"/>
	<xsl:template match="/">
		<Anteeo>
			<table name="STATUS" service="{$service}">
				<!-- All error records should follow this format. If they don't change the format for  
                                all error messages. -->
				<xsl:choose>
					<xsl:when test="/*[local-name() = 'OTA_HotelAvailRS']/*[local-name() = 'Errors']/*[local-name() = 'Error'][@Code != '']">
						<Error
							AnteeoReason="There was an error retrieving availability."
							ErrorCode="{.//ota:Errors/ota:Error/@Code}"
							ErrorText="{.//ota:Errors/ota:Error/@ShortText}"
							ErrorText2=""
							Code=""
							AppErrorSeverityLevel=""
							QuickIndicator="N"
						/>
					</xsl:when>
					<xsl:when test="/*[local-name() = 'OTA_HotelAvailRS']/*[local-name() = 'Warning']/*[local-name() = 'Warning'][@Code != '']">
						<Warning
							AnteeoReason="There was a warning retrieving availability."
							ErrorCode="{/*[local-name() = 'OTA_HotelAvailRS']/*[local-name() = 'Warning']/*[local-name() = 'Warning']/@Code}"
							ErrorText="{/*[local-name() = 'OTA_HotelAvailRS']/*[local-name() = 'Warning']/*[local-name() = 'Warning']/@ShortText}"
							ErrorText2=""
							Code=""
							AppErrorSeverityLevel=""
							QuickIndicator="N"
						/>
					</xsl:when>
					<xsl:when test="/*[local-name() = 'OTA_HotelAvailRS']/*[local-name() = 'Errors']/*[local-name() = 'Error'][@Code != ''] | /ota:OTA_HotelAvailRS/*[local-name() = 'Success']">
						<Error
								AnteeoReason="All OK."
								ErrorCode=""
								ErrorText=""
								ErrorText2=""
								Code=""
								AppErrorSeverityLevel=""
								QuickIndicator="Y"
                                                />
					</xsl:when>
				</xsl:choose>

			</table>
			<xsl:apply-templates select=".//ota:OTA_HotelAvailRS/ota:RoomStays"/>
		</Anteeo>

	</xsl:template>

	<!--  
        <xsl:template match="ota:Errors"> 
                <Error 
                        AnteeoReason="There was an error retrieving availability." 
                        ErrorCode="{/Error/Code}" 
                        ErrorText="{//Error/ShortText}" 
                        ErrorText2="" 
                        Code="{/Error/Code}" 
                        AppErrorSeverityLevel="" 
                        QuickIndicator="N" 
                                /> 
        </xsl:template> 
 
        <xsl:template match="message"> 
                <xsl:apply-templates /> 
        </xsl:template>         -->

	<xsl:template match="alternatelistseg">
		<table name="HotelAvail" service="{$service}">
			<xsl:apply-templates />
		</table>
	</xsl:template>
	<!--    <xsl:template match="/"> 
                <xsl:apply-templates select="ota:OTA_HotelAvailRS/ota:RoomStays"/> 
        </xsl:template> 
-->
	<xsl:template match="ota:RoomStays">
		<table name="HotelAvail" service="">
			<xsl:apply-templates select="ota:RoomStay"/>
		</table>
	</xsl:template>
	<xsl:template match="ota:TimeSpan">
		<xsl:attribute name="TimeStart">
			<xsl:value-of select="@Start"/>
		</xsl:attribute>
		<xsl:attribute name="TimeDuration">
			<xsl:value-of select="@Duration"/>
		</xsl:attribute>
	</xsl:template>
	<xsl:template match="ota:Total">
		<xsl:attribute name="AmountAfterTax">
			<xsl:value-of select="@AmountAfterTax"/>
		</xsl:attribute>
		<!-- 09/12/2009 <xsl:attribute name="TimeDuration"> 
                        <xsl:value-of select="@Duration"/> 
                </xsl:attribute>                -->
	</xsl:template>
	<xsl:template match="ota:ResGuestRPHs">
		<xsl:for-each select="ota:ResGuestRPH">
			<xsl:attribute name="ResGuestRPH-{position()}">
				<xsl:value-of select="@RPH"/>
			</xsl:attribute>
		</xsl:for-each>
	</xsl:template>
	<xsl:template match="ota:RoomRates">
		<xsl:for-each select="ota:RoomRate">
			<xsl:attribute name="RoomRate-{position()}">
				<xsl:value-of select="@RatePlanCode"/>
			</xsl:attribute>
		</xsl:for-each>
	</xsl:template>
	<xsl:template match="ota:BasicPropertyInfo">
		<xsl:attribute name="ID">
			<xsl:value-of select="@HotelCodeContext"/>
		</xsl:attribute>
		<xsl:attribute name="VendorMessage">
			<xsl:value-of select="ota:VendorMessages"/>
		</xsl:attribute>
	</xsl:template>
	<xsl:template match="ota:CancelPenalties">
		<xsl:for-each select="ota:CancelPenalty">
			<xsl:attribute name="CancelPenalty-{position()}">
				<xsl:value-of select="ota:Deadline/@OffsetUnitMultiplier"/>
			</xsl:attribute>
		</xsl:for-each>
	</xsl:template>
	<xsl:template match="ota:RoomStay">
		<xsl:element name="AvailHtl">
			<xsl:attribute name="MaxOccupancy"></xsl:attribute>
			<xsl:attribute name="Minoccupancy"></xsl:attribute>
			<xsl:apply-templates select="*"/>
		</xsl:element>
	</xsl:template>

</xsl:stylesheet>

Open in new window

Avatar of ube100

ASKER

Hi Gerton,

It is still producing this output even though this source is with the warning node:

<table name="STATUS" service="">
    <Error AnteeoReason="All OK." ErrorCode="" ErrorText="" ErrorText2="" Code="" AppErrorSeverityLevel="" QuickIndicator="Y" />
  </table>

well, with the source you posted, I get a different result.
Mixed up the source again?
Please post a new one then
Avatar of ube100

ASKER

Please find the source XML.
AmericaDirectAvailabilityRespons.xml
ASKER CERTIFIED SOLUTION
Avatar of Gertone (Geert Bormans)
Gertone (Geert Bormans)
Flag of Belgium image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of ube100

ASKER

Sorry for the time you have wasted. Thanks!
welcome,
no problem, just be carefull with posting correct sources