[xsl] XSLT Comparison of Two Trees

Subject: [xsl] XSLT Comparison of Two Trees
From: "Doug Franklin" <doug@xxxxxxxxxxxxxxxx>
Date: Tue, 08 Sep 2009 10:44:00 -0700
I wish to compare two (xml tree) documents, a previous document and it's
current version.  The previous tree looks like this: (the current tree
appears below this previous tree, the xsl - below that.)

If I could

    A. Create a report of zip codes that were added
    B. Create a report of zip codes that were deleted
    C. Create a report of zip codes that were moved
    D. Find the percentage difference of the <Total>####</Total>
information, using this algorithm: (currentTotal -
previousTotal)/previousTotal

That would be SPLENDID.

Thanks,

Doug

<?xml version="1.0" encoding="UTF-8"?>
<!-- <?xml-stylesheet href="Comparison.xsl" type="text/xsl" ?> -->
<?xml-stylesheet href="Comparison.xsl" type="text/xsl" ?>
<!-- <?xml-stylesheet href="Comparison2.xsl" type="text/xsl" ?> -->
<pFieldOfficeList>
 <city name="All areas">
  <zip zipCode="zipTotals">
   <Total>49864838</Total>
  </zip>
 </city>
 <city name="Total, California">
  <zip zipCode="zipTotals">
   <Total>4571486</Total>
  </zip>
 </city>
 <city name="Alhambra">
  <zip zipCode="zipTotals">
   <Total>17145</Total>
  </zip>
  <zip zipCode="91775">
   <Total>3160</Total>
  </zip>
  <zip zipCode="91776">
   <Total>3540</Total>
  </zip>
  <zip zipCode="91778">
   <Total>140</Total>
  </zip>
  <zip zipCode="91801">
   <Total>5790</Total>
  </zip>
 </city>
 <city name="American River">
  <zip zipCode="zipTotals">
   <Total>79685</Total>
  </zip>
  <zip zipCode="95610">
   <Total>5750</Total>
  </zip>
  <zip zipCode="95611">
   <Total>335</Total>
  </zip>
  <zip zipCode="95621">
   <Total>7135</Total>
  </zip>
  <zip zipCode="95628">
   <Total>7325</Total>
  </zip>
 </city>
 <city name="Anaheim">
  <zip zipCode="zipTotals">
   <Total>53765</Total>
  </zip>
  <zip zipCode="90620">
   <Total>5960</Total>
  </zip>
  <zip zipCode="90621">
   <Total>2810</Total>
  </zip>
  <zip zipCode="90622">
   <Total>105</Total>
  </zip>
  <zip zipCode="90623">
   <Total>2320</Total>
  </zip>
 </city>
 <city name="Antioch">
  <zip zipCode="zipTotals">
   <Total>33190</Total>
  </zip>
  <zip zipCode="94505">
   <Total>1575</Total>
  </zip>
  <zip zipCode="94509">
   <Total>8235</Total>
  </zip>
  <zip zipCode="94511">
   <Total>740</Total>
  </zip>
  <zip zipCode="94513">
   <Total>6855</Total>
  </zip>
 </city>
 <city name="Auburn">
  <zip zipCode="zipTotals">
   <Total>41830</Total>
  </zip>
  <zip zipCode="95602">
   <Total>4100</Total>
  </zip>
  <zip zipCode="95603">
   <Total>5535</Total>
  </zip>
  <zip zipCode="95604">
   <Total>775</Total>
  </zip>
  <zip zipCode="95631">
   <Total>1295</Total>
  </zip>
 </city>
 <city name="Bakersfield">
  <zip zipCode="zipTotals">
   <Total>52885</Total>
  </zip>
  <zip zipCode="93205">
   <Total>805</Total>
  </zip>
  <zip zipCode="93206">
   <Total>200</Total>
  </zip>
  <zip zipCode="93222">
   <Total>460</Total>
  </zip>
  <zip zipCode="93224">
   <Total>95</Total>
  </zip>
 </city>
 <city name="Bakersfield, East Hills">
  <zip zipCode="zipTotals">
   <Total>28325</Total>
  </zip>
  <zip zipCode="93203">
   <Total>1500</Total>
  </zip>
  <zip zipCode="93220">
   <Total>70</Total>
  </zip>
  <zip zipCode="93241">
   <Total>1510</Total>
  </zip>
  <zip zipCode="93305">
   <Total>3475</Total>
  </zip>
 </city>
</pFieldOfficeList>

Tree of current information:
<?xml version="1.0" encoding="UTF-8"?>
<!-- <?xml-stylesheet href="Comparison.xsl" type="text/xsl" ?> -->
<?xml-stylesheet href="Comparison.xsl" type="text/xsl" ?>
<!-- <?xml-stylesheet href="Comparison2.xsl" type="text/xsl" ?> -->
<cFieldOfficeList>
 <city name="All areas">
  <zip zipCode="zipTotals">
   <Total>49864838</Total>
  </zip>
 </city>
 <city name="Total, California">
  <zip zipCode="zipTotals">
   <Total>4571486</Total>
  </zip>
 </city>
 <city name="Alhambra">
  <zip zipCode="zipTotals">
   <Total>17145</Total>
  </zip>
  <zip zipCode="91775">
   <Total>3160</Total>
  </zip>
  <zip zipCode="91776">
   <Total>3540</Total>
  </zip>
  <zip zipCode="91778">
   <Total>140</Total>
  </zip>
  <zip zipCode="91801">
   <Total>5790</Total>
  </zip>
  <zip zipCode="11111"><!-- This zip code was added to Alhambra -->
   <Total>1000</Total>
  </zip>
 </city>
 <city name="American River">
  <zip zipCode="zipTotals">
   <Total>79685</Total>
  </zip>
  <zip zipCode="95611">
   <Total>335</Total>
  </zip>
  <!-- <zip zipCode="95621">
   <Total>7135</Total>
  </zip> --><!-- This zip code was deleted from American River -->
 </city>
 <city name="Anaheim">
  <zip zipCode="95610"><!-- zip code was moved from American River to
Anaheim -->
   <Total>5750</Total>
  </zip>
  <zip zipCode="zipTotals">
   <Total>53765</Total>
  </zip>
  <zip zipCode="90620">
   <Total>5960</Total>
  </zip>
  <zip zipCode="90621">
   <Total>2810</Total>
  </zip>
  <zip zipCode="90622">
   <Total>105</Total>
  </zip>
  <zip zipCode="90623">
   <Total>2320</Total>
  </zip>
 </city>
 <city name="Antioch">
  <zip zipCode="zipTotals">
   <Total>33190</Total>
  </zip>
  <zip zipCode="22222"><!-- This zip code was added to Antioch -->
   <Total>5790</Total>
  </zip>
  <!-- <zip zipCode="94505">
   <Total>1575</Total>
  </zip> --><!-- This zip code was deleted from Antioch -->
  <zip zipCode="94509">
   <Total>8235</Total>
  </zip>
  <zip zipCode="94511">
   <Total>740</Total>
  </zip>
  <zip zipCode="94513">
   <Total>6855</Total>
  </zip>
 </city>
 <city name="Auburn">
  <zip zipCode="zipTotals">
   <Total>41830</Total>
  </zip>
  <zip zipCode="33333"><!-- This zip code was added to Auburn -->
   <Total>5790</Total>
  </zip>
  <zip zipCode="95628"><!-- This zip code was moved from American River
to Auburn -->
   <Total>7325</Total>
  </zip>
  <zip zipCode="95602">
   <Total>4100</Total>
  </zip>
  <zip zipCode="95603">
   <Total>5535</Total>
  </zip>
  <zip zipCode="95604">
   <Total>775</Total>
  </zip>
  <zip zipCode="95631">
   <Total>1295</Total>
  </zip>
 </city>
 <city name="Bakersfield"><!-- Nothing happened to this zip code -->
  <zip zipCode="zipTotals">
   <Total>52885</Total>
  </zip>
  <zip zipCode="93205">
   <Total>805</Total>
  </zip>
  <zip zipCode="93206">
   <Total>200</Total>
  </zip>
  <zip zipCode="93222">
   <Total>460</Total>
  </zip>
  <zip zipCode="93224">
   <Total>95</Total>
  </zip>
 </city>
 <city name="Bakersfield, East Hills"><!-- Nothing happened to this zip
code -->
  <zip zipCode="zipTotals">
   <Total>28325</Total>
  </zip>
  <zip zipCode="93203">
   <Total>1500</Total>
  </zip>
  <zip zipCode="93220">
   <Total>70</Total>
  </zip>
  <zip zipCode="93241">
   <Total>1510</Total>
  </zip>
  <zip zipCode="93305">
   <Total>3475</Total>
  </zip>
 </city>
</cFieldOfficeList>

XSL:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
 <xsl:template match="/">
  <html>
   <body>
    <head>
     <title>City Evaluation</title>
    </head>
    <h3><font color="darkred">Cities</font></h3>
    <xsl:apply-templates/>
   </body>
  </html>
 </xsl:template>
 <xsl:template match="/">
 <!-- <xsl:template match="@*|node()"> -->
 <!-- <xsl:template match="*"> -->
  <!-- <xsl:for-each
select="document('cMulberry.xml')/cMulberry/city/@name"> -->
   <!-- <xsl:if
test="select=document('cMulberry.xml')/cMulberry/city/@name='Alhambra'">
-->
   <!-- <xsl:if test="position()=3">
    <xsl:value-of select="."/><br/>
   </xsl:if>
  </xsl:for-each> -->
  <xsl:for-each select="pFieldOfficeList">
   <html>

   <table border="1">
    <xsl:for-each select="city">
     <tr>
      <td width="100" align="center" bgcolor="goldenrod">
       <xsl:value-of select="@name"/></td>

       <td align="center">I would like column headers here</td>
      <td align="center">I would like the cities from the cMulberry XML
document here
       <xsl:for-each select="zip">
        <tr>
         <td align="right"><font size="2"><xsl:value-of
select="@zipCode"/></font></td>
         <td><xsl:call-template name="infoCell" /></td>
        </tr>
       </xsl:for-each>
      </td>
     </tr>

    </xsl:for-each>
   </table>

   </html>
  </xsl:for-each>
 </xsl:template>
 <!-- <xsl:apply-templates
select="document('cMulberry.xml')/cMulberry/city/@name"/> This displays
all new cities -->
 <xsl:template name="infoCell">
  <table border="1" width="100%"><tr><td width="10%" align="right"><font
size="2"><xsl:value-of select="Total"/></font></td>
             <td width="10%" align="right"><font size="2"><xsl:value-of
select="Retired_Workers"/></font></td>
             <td width="10%" align="right"><font size="2"><xsl:value-of
select="Disabled_Workers"/></font></td>
             <td width="10%" align="right"><font size="2"><xsl:value-of
select="Widow_er_s"/></font></td>
             <td width="10%" align="right"><font size="2"><xsl:value-of
select="Spouses"/></font></td>
             <td width="10%" align="right"><font size="2"><xsl:value-of
select="Children"/></font></td>
             <td width="10%" align="right"><font size="2"><xsl:value-of
select="Total_All"/></font></td>
             <td width="10%" align="right"><font size="2"><xsl:value-of
select="Total_Retired_Workers"/></font></td>
             <td width="10%" align="right"><font size="2"><xsl:value-of
select="Total_Widow_er_s"/></font></td>
             <td width="10%" align="right"><font size="2"><xsl:value-of
select="Sixty-Five_plus"/></font></td>
           </tr></table>
 </xsl:template>
 <xsl:template name="equalCities">
  <h1>Hello</h1>
 </xsl:template>
</xsl:stylesheet>

Current Thread