xsl-list
[Top] [All Lists]

problem with an xml/xsl transformation

2004-04-05 08:55:29
Hi,
I'm having a problem with an xml/xsl transformation.
Here's my input xml:

<?ACORD version="1.1.0"?>
<ACORD>
        <ClaimsSvcRq>
                <RqUID>WD8AC682D22724742BE75ACE677BB1A94W</RqUID>
                <ClaimsNotificationAddRq>
                        <RqUID>789B6D9C-8C5F-430A-95D9-533691A50E66</RqUID>
                        <ClaimsParty id="W8D7A048C211A4977BD1960FEE2CED8D8W">
                                <GeneralPartyInfo>
                                        <NameInfo>
                                                <CommlName>
                                                        <CommercialName>C J 
Pounder III &amp; Brock Pounde</CommercialName>
                                                </CommlName>
                                        </NameInfo>
                                        <Addr>
                                                <Addr1>1525 E Kaywood 
Way</Addr1>
                                                <City>Spokane</City>
                                                <StateProvCd>WA</StateProvCd>
                                                <PostalCode>99208-</PostalCode>
                                        </Addr>
                                </GeneralPartyInfo>
                                <PersonInfo>
                                        <BirthDt>1955-01-03</BirthDt>
                                </PersonInfo>
                                <ClaimsPartyInfo>
                                        
<ClaimsPartyRoleCd>VEH</ClaimsPartyRoleCd>
                                        
<ClaimsPartyRoleCd>DRV</ClaimsPartyRoleCd>
                                        
<ClaimsPartyLocCd>INSVEH</ClaimsPartyLocCd>
                                        
<RelationshipToInsuredCd>IN</RelationshipToInsuredCd>
                                        <OtherOrPriorPolicy>
                                                <PolicyCd/>
                                                <LOBCd>BLANK</LOBCd>
                                                <InsurerName>other 
insurancex</InsurerName>
                                        </OtherOrPriorPolicy>
                                </ClaimsPartyInfo>
                                <ClaimsDriverInfo>
                                        <DriversLicense>
                                                
<DriversLicenseNumber>DRIVERSLICNUMBERX</DriversLicenseNumber>
                                                <StateProvCd>WA</StateProvCd>
                                        </DriversLicense>
                                        <PurposeUse>purpose of u</PurposeUse>
                                        <PermissionInd>1</PermissionInd>
                                </ClaimsDriverInfo>
                        </ClaimsParty>
                </ClaimsNotificationAddRq>
        </ClaimsSvcRq>
</ACORD>

and my xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

        <xsl:output method="xml" indent="yes"/>

        <!-- Use This To Select The Correct AutoLossInfo Aggregate For The 
Insured Vehicle Owner -->
        <xsl:variable name="OwnerRefID" 
select="ACORD/ClaimsSvcRq/ClaimsNotificationAddRq/ClaimsParty[descendant::ClaimsPartyRoleCd='VEH'
 and descendant::ClaimsPartyLocCd='INSVEH']/@id"/>

        <!-- Use This To Select The Driver In The Insured Vehicle -->
        <xsl:variable name="DriverInsuredVehicleID" 
select="ACORD/ClaimsSvcRq/ClaimsNotificationAddRq/ClaimsParty[descendant::ClaimsPartyRoleCd='DRV'
 and descendant::ClaimsPartyLocCd='INSVEH']/@id"/>

        <xsl:template match="*">
                <xsl:element name="UdtFNOLArray">
                        <!-- Insured Vehicle - Can Be Multiple -->
                        <xsl:call-template name="DoVehicleData"/>
                </xsl:element>
        </xsl:template> 
        
        <xsl:template 
match="ClaimsSvcRq/ClaimsNotificationAddRq/AutoLossInfo/BasicVehInfo">
                <!-- Vehicle Data -->
                <xsl:element name="VehicleYear">
                        <xsl:value-of select="ModelYear"/>
                </xsl:element>
                <xsl:element name="Make">
                        <xsl:value-of select="Manufacturer"/>
                </xsl:element>
                <xsl:element name="Model">
                        <xsl:value-of select="Model"/>
                </xsl:element>          
                <!-- Vehicle Data -->
        </xsl:template>
        
        <xsl:template 
match="ClaimsSvcRq/ClaimsNotificationAddRq/ClaimsParty/ClaimsPartyInfo[descendant::ClaimsPartyRoleCd='VEH'
 and descendant::ClaimsPartyLocCd='INSVEH']">
                <xsl:element name="OwnerName">
                        <xsl:call-template name="GetName"/>
                </xsl:element>
        </xsl:template>

        <xsl:template 
match="ClaimsSvcRq/ClaimsNotificationAddRq/ClaimsParty/ClaimsPartyInfo[descendant::ClaimsPartyRoleCd='DRV'
 and descendant::ClaimsPartyLocCd='INSVEH']">
                <xsl:element name="DriverName">
                        <xsl:call-template name="GetName"/>
                </xsl:element>
        </xsl:template>

        <xsl:template name="GetName">
                <xsl:choose>
                        <!-- The Following Tests If The XML Element Tag Exists 
Or Not -->
                        <xsl:when 
test="boolean(../GeneralPartyInfo/NameInfo/CommlName/CommercialName)">
                                <xsl:value-of 
select="../GeneralPartyInfo/NameInfo/CommlName/CommercialName"/>
                        </xsl:when>
                        <xsl:otherwise>
                                <xsl:value-of 
select="../GeneralPartyInfo/NameInfo/PersonName/GivenName"/><xsl:text> 
</xsl:text>
                                <xsl:value-of 
select="../GeneralPartyInfo/NameInfo/PersonName/OtherGivenName"/><xsl:text> 
</xsl:text>
                                <xsl:value-of 
select="../GeneralPartyInfo/NameInfo/PersonName/Surname"/>
                        </xsl:otherwise>
                </xsl:choose>
        </xsl:template>
        
        <xsl:template name="DoVehicleData">
                <xsl:element name="VehicleData">
                        <xsl:apply-templates 
select="ClaimsSvcRq/ClaimsNotificationAddRq/AutoLossInfo[(_at_)OwnerRef=$OwnerRefID]/BasicVehInfo"/>

                        <xsl:choose>
                                <xsl:when 
test="$OwnerRefID=$DriverInsuredVehicleID">
                                        <!-- Vehicle Owner Is Same As Vehicle 
Driver -->
                                        <xsl:apply-templates 
select="ClaimsSvcRq/ClaimsNotificationAddRq/ClaimsParty/ClaimsPartyInfo[descendant::ClaimsPartyRoleCd='VEH'
 and descendant::ClaimsPartyLocCd='INSVEH']"/>
                                        <xsl:apply-templates 
select="ClaimsSvcRq/ClaimsNotificationAddRq/ClaimsParty/ClaimsPartyInfo[descendant::ClaimsPartyRoleCd='DRV'
 and descendant::ClaimsPartyLocCd='INSVEH']"/>
                                </xsl:when>
                                <xsl:otherwise>
                                        <xsl:apply-templates 
select="ClaimsSvcRq/ClaimsNotificationAddRq/ClaimsParty[(_at_)id=$OwnerRefID]/ClaimsPartyInfo"/>
                                </xsl:otherwise>
                        </xsl:choose>

                </xsl:element>
        </xsl:template>

</xsl:stylesheet>

what the transform looks like:

<?xml version="1.0" encoding="UTF-8"?>
<UdtFNOLArray>
        <VehicleData>
                <DriverName>C J Pounder III &amp; Brock Pounde</DriverName>
                <DriverName>C J Pounder III &amp; Brock Pounde</DriverName>
        </VehicleData>
</UdtFNOLArray>

and what it should look like:

<?xml version="1.0" encoding="UTF-8"?>
<UdtFNOLArray>
        <VehicleData>
                <OwnerName>C J Pounder III &amp; Brock Pounde</DriverName>
                <DriverName>C J Pounder III &amp; Brock Pounde</DriverName>
        </VehicleData>
</UdtFNOLArray>

The Driver element gets repeated. If I switch locations of the Owner and Driver 
xsl sections, the Owner gets repeated. I'm thinking this is do to similar 
templates having only the "descendant::ClaimsPartyRoleCd='VEH'" being different 
and the last one "wins". But I'm having difficulty coming up with a different 
method that works.
Any help would be appreciated.
thanks!  gary


<Prev in Thread] Current Thread [Next in Thread>