Re: [xsl] Merging Data

Subject: Re: [xsl] Merging Data
From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx>
Date: Fri, 6 Aug 2004 23:44:22 -0700 (PDT)
Hi Kevin,
  Please try this stylesheet. This is a XSLT 1.0
solution and uses a nodeset extension function.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:xalan="http://xml.apache.org/xalan";
exclude-result-prefixes="xalan">
	
<xsl:output method="xml"  indent="yes"/>	

<xsl:variable name="filea"
select="document('filea.xml')" /> 
<xsl:variable name="fileb"
select="document('fileb.xml')" />
	
<xsl:template match="/">
  <supplements>
	     
  <!--finding supp-desc tags common to both files -->
  <xsl:for-each select="supplements/supp">
    <xsl:variable name="desc-a" select="supp-desc" />
    <xsl:variable name="price-a" select="supp-price"
/>
    <xsl:for-each select="$fileb/supplements/supp">
      <xsl:if test="supp-desc = $desc-a">
       <supp>
         <supp-desc><xsl:value-of select="supp-desc"
/></supp-desc>
         <supp-price source="filea"><xsl:value-of
select="$price-a" /></supp-price>
         <supp-price source="fileb"><xsl:value-of
select="supp-price" /></supp-price>
       </supp>
      </xsl:if>
    </xsl:for-each>
  </xsl:for-each>
  <!--finding supp-desc tags existing only in
filea.xml -->
  <xsl:for-each select="supplements/supp">
    <xsl:variable name="desc-a" select="supp-desc" />
    <xsl:variable name="price-a" select="supp-price"
/>
    <xsl:variable name="rtf">
      <xsl:for-each select="$fileb/supplements/supp"> 
                   
        <xsl:if test="supp-desc = $desc-a">
          <x/>
        </xsl:if>
      </xsl:for-each>                    
     </xsl:variable>
     <xsl:if test="count(xalan:nodeset($rtf)/x) = 0">
        <supp>
          <supp-desc><xsl:value-of select="$desc-a"
/></supp-desc>
          <supp-price source="filea"><xsl:value-of
select="$price-a" /></supp-price>
	  <supp-price source="fileb">-</supp-price>
	</supp>
      </xsl:if>
   </xsl:for-each>
   <!--finding supp-desc tags existing only in
fileb.xml -->
   <xsl:for-each select="$fileb/supplements/supp">
     <xsl:variable name="desc-b" select="supp-desc" />
     <xsl:variable name="price-b" select="supp-price"
/>
     <xsl:variable name="rtf">
       <xsl:for-each select="$filea/supplements/supp">
                    
          <xsl:if test="supp-desc = $desc-b">
            <x/>
          </xsl:if>
       </xsl:for-each>                    
     </xsl:variable>
     <xsl:if test="count(xalan:nodeset($rtf)/x) = 0"> 
       <supp>
         <supp-desc><xsl:value-of select="$desc-b"
/></supp-desc>
         <supp-price source="filea">-</supp-price>
         <supp-price source="fileb"><xsl:value-of
select="$price-b" /></supp-price>
       </supp>
     </xsl:if>
  </xsl:for-each>
            
  </supplements>	  	  	  
</xsl:template>
	
</xsl:stylesheet>

Regards,
Mukul

--- Kevin Bird <kevin.bird@xxxxxxxxxxxxxxxxxxxxxxx>
wrote:

> Hi Everyone
> 
> I need to combine two sets of data (File A and File
> B). The structure is as follows (snippet):
> 
> FILE A:
> <supplements>
> <supp>
> 	<supp-desc>Half Board</supp-desc>
> 	<supp-price>#10</supp-price>
> </supp>
> <supp>
> 	<supp-desc>All Inclusive</supp-desc>
> 	<supp-price>#20</supp-price>
> </supp>
> <supp>
> 	<supp-desc>Sea View</supp-desc>
> 	<supp-price>#3</supp-price>
> </supp>
> ...
> </supplements>
> 
> FILE B:
> <supplements>
> <supp>
> 	<supp-desc>Half Board</supp-desc>
> 	<supp-price>#20</supp-price>
> </supp>
> <supp>
> 	<supp-desc>All Inclusive</supp-desc>
> 	<supp-price>#40</supp-price>
> </supp>
> <supp>
> 	<supp-desc>Balcony</supp-desc>
> 	<supp-price>#5</supp-price>
> </supp>
> ...
> </supplements>
> 
> REQUIRED OUTPUT:
> <supplements>
> <supp>
> 	<supp-desc>Half Board</supp-desc>
> 	<supp-price source="filea">#10</supp-price>
> 	<supp-price source="fileb">#20</supp-price>
> </supp>
> <supp>
> 	<supp-desc>All Inclusive</supp-desc>
> 	<supp-price source="filea">#20</supp-price>
> 	<supp-price source="fileb">#40</supp-price>
> </supp>
> <supp>
> 	<supp-desc>Sea View</supp-desc>
> 	<supp-price source="filea">#3</supp-price>
> 	<supp-price source="fileb">-</supp-price></supp>
> <supp>
> 	<supp-desc>Balcony</supp-desc>
> 	<supp-price source="filea">-</supp-price>
> 	<supp-price source="fileb">#5</supp-price></supp>
> ...
> </supplements>
> 
> DESCRIPTION:
> I need to compare <supp> nodes based on the text
> value of <supp-desc>. If the <supp> exists in both
> files then the <supp-price> node from File B is
> added underneath the <supp-price> node from File A
> (a "source" attribute is also added). If the <supp>
> exists in one file but not the other, a <supp-price>
> node with the text value of "-" is added. "Sea View"
> and "Balcony" are examples of <supp> being present
> in one file only.
> 
> Any suggestions on how best to achieve the desired
> result will be greatly appreciated.
> 
>  
> --
> Kevin Bird



		
__________________________________
Do you Yahoo!?
Yahoo! Mail - 50x more storage than other providers!
http://promotions.yahoo.com/new_mail

Current Thread