Wrox Programmer Forums

Need to download code?

View our list of code downloads.

Go Back   Wrox Programmer Forums > XML > BOOK: Beginning XSLT and XPath : Transforming XML Documents and Data
Password Reminder
Register
Register | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read
BOOK: Beginning XSLT and XPath : Transforming XML Documents and Data
This is the forum to discuss the Wrox book Beginning XSLT and XPath : Transforming XML Documents and Data by Ian Williams ISBN: 978-0-470-47725-0
Welcome to the p2p.wrox.com Forums.

You are currently viewing the BOOK: Beginning XSLT and XPath : Transforming XML Documents and Data section of the Wrox Programmer to Programmer discussions. This is a community of tens of thousands of software programmers and website developers including Wrox book authors and readers. As a guest, you can read any forum posting. By joining today you can post your own programming questions, respond to other developersí questions, and eliminate the ads that are displayed to guests. Registration is fast, simple and absolutely free .
DRM-free e-books 300x50
 
 
Thread Tools Display Modes
  #1 (permalink)  
Old May 18th, 2012, 03:20 PM
Registered User
Points: 5, Level: 1
Points: 5, Level: 1 Points: 5, Level: 1 Points: 5, Level: 1
Activity: 0%
Activity: 0% Activity: 0% Activity: 0%
 
Join Date: May 2012
Posts: 1
Thanks: 0
Thanked 0 Times in 0 Posts
Default I want to implement Muenchain grouping in my XSLT Code (Very urgent please help)

Hi all ,
I'm a SQL Guy but i was asked to look into this following java script .js file and xslt code.

Currently i have performance issue with my xslt code so i want to implement muenchain grouping technique in my xslt code.
Let me explain you . I have a .js file when i double click .js file it will take the .csv in that folder and creates a temp xml file with in .js file and calls the xslt code and transforms to gives me an desired .xml output file.

/*sample .csv file data*/
Code:
RebateInvoiceID	RebateEventID	BusinessUnitCode	CategoryID	PaymentAmount
1001878	1003042	402	1000057	89
1001878	1003042	405	1000057	94.42
1001878	1003043	406	1000057	147.5
1001878	1003048	423	1000057	97.36
1001879	1008042	433	1000057	89
1001879	1008042	434	1000057	70.24
1001879	1008942	435	1000057	53.08
1001978	2003042	437	1000057	127.85
1001978	2003042	438	1000057	180.04
1001978	3003042	446	1000057	146.61
1001978	3003042	448	1000057	76.56
/* Part of my .js code which shows how it creates the temp xml and calls xslt and transforms it */

Code:
function  convertCSVtoXML(foldername, filename)
{ 
  var objDOMDocument = new ActiveXObject("MSXML2.DOMdocument.4.0"); 
  objDOMdocument.async = false; 
  
  //Create Header
  objDOMdocument.appendChild(XMLHeader(objDOMDocument)); 
  var objXMLDOMNode = objDOMdocument.documentElement.selectSingleNode("//Document"); 
 
  // Declare XML object -- this makes it easier to pass as a parameter 
  var objXML  = new Object(); 
  
  // Open the extracted csv from zip file
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  
  var csvFilename = filename;
  
  var tso = fso.OpenTextFile(csvFilename, 1); 
  var strInput; 
  
  // Loop through the file 
  while(!tso.AtEndOfStream)  
  { 
    strInput = tso.ReadLine();
    
    var vInputLine = strInput.split(","); 
    objXML.a = vInputLine[0];
    objXML.b = vInputLine[1];
    objXML.c = vInputLine[2];
    objXML.d = vInputLine[3];
    objXML.e = vInputLine[4];

                
    
    if (objXML.a != 'RebateInvoiceID')
    {
    objXMLDOMNode.appendChild(XMLFileNode(objDOMDocument,objXML));
    }    
  } 
  tso.Close();
  
  // Load Transform file
  var TransformXSL = new ActiveXObject("MSXML2.DOMdocument.4.0");
  TransformXSL.async = false  
  TransformXSL.load(foldername + "\\InvAdj.xsl");
  
  // Load XML file and transform it
  var TempStagingDoc = new ActiveXObject("MSXML2.DOMdocument.4.0");
  TempStagingDoc.async = false; 
  TempStagingDoc.loadXML(objDOMdocument.xml);      
  var FinalStr = TempStagingDoc.transformNode(TransformXSL);
  
  // Grab just the file name minus any extension
  var fn = filename.substring(0, filename.indexOf(".csv")); 
  tmpxml = fn + ".xml";  
  
  // Write out the transformed file. If writing out just the xml file before transform  
//  FSObject.WriteLine(objDOMdocument.xml);     
  
  var FSObject = fso.CreateTextFile(tmpxml, true);
  FSObject.WriteLine(FinalStr);
  FSObject.Close();
  
/*
  // Create empty .flag file then rename it
  tmpxml += ".flag";
  var fsoEmptyFile = fso.CreateTextFile(tmpxml, true);
  fsoEmptyFile.Close();
  
  // Rename the .flag file to .done
  var donefilename = tmpxml.substring(0,tmpxml.indexOf(".flag",0));
  donefilename += ".done";
  fso.MoveFile(tmpxml, donefilename);
  
  // Delete the corresponding .csv file
  fso.DeleteFile(csvFilename);

  */


  // Clear all objects
  objDOMDocument = null; 
  fso = null;
  TransformXSL = null;
  objXML = null;
  TempStagingDoc = null;
}

function XMLHeader(objDOMDocument)
{ 
  var XMLHead;
  XMLHead = objDOMdocument.createNode(1, "Document",""); 
  
  var objXMLDOMAttribute = objDOMdocument.createAttribute("Version"); 
  objXMLDOMAttribute.text = "1.0";
  XMLHead.attributes.setNamedItem(objXMLDOMAttribute);
  
  var objXMLDOMAttribute = objDOMdocument.createAttribute("CreationTimestamp"); 
  objXMLDOMAttribute.text = getTimestamp();
  XMLHead.attributes.setNamedItem(objXMLDOMAttribute);
  
  return(XMLHead);
} 

function XMLFileNode(objDOMDocument,objXML)
{     
  var objXMLDOMNode = objDOMdocument.createNode(1, "RawXMLRow","");
  
  objXMLDOMElement = objDOMdocument.createElement("RebateInvoiceID"); 
  objXMLDOMElement.text = objXML.a;
  objXMLDOMNode.appendChild(objXMLDOMElement);
    
  objXMLDOMElement = objDOMdocument.createElement("RebateEventID"); 
  objXMLDOMElement.text = objXML.b;
  objXMLDOMNode.appendChild(objXMLDOMElement);
      
  objXMLDOMElement = objDOMdocument.createElement("BusinessUnitCode");
   function getBusinessUnitCode(){
    var r = String(objXML.c).length;
    if(r == 4)
    return String(objXML.c);
    if( r == 3)
  	  return "0"+String(objXML.c);
  	  if(r == 2){
  		  	  return "00"+String(objXML.c);
  	  }
  	  else
  		  	  return "000"+String(objXML.c);
  
  }
  objXMLDOMElement.text = getBusinessUnitCode();
   objXMLDOMNode.appendChild(objXMLDOMElement);
    
  objXMLDOMElement = objDOMdocument.createElement("CategoryID"); 
  objXMLDOMElement.text = objXML.d;
  objXMLDOMNode.appendChild(objXMLDOMElement);
  
  objXMLDOMElement = objDOMdocument.createElement("PaymentAmount"); 
  objXMLDOMElement.text = objXML.e;
  objXMLDOMNode.appendChild(objXMLDOMElement);
    
  return(objXMLDOMNode);
}
/* code for xslt */ (which has to be replaced with Muenchain grouping technique)
Code:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:script="script" exclude-result-prefixes="msxsl">
  <xsl:output omit-xml-declaration="yes"/>

  <!-- ROOT -->
  <xsl:template match="/">
    <EnterpriseDocument>
      <xsl:attribute name="InterfaceName">RebateInvoiceAdjustmentImport</xsl:attribute>
      <xsl:attribute name="ClientID">
        <xsl:choose>
          <xsl:when test="normalize-space(ClientID)">
            <xsl:value-of select="//Document/RawXMLRow/ClientID"/>
          </xsl:when>
          <xsl:otherwise>1000001</xsl:otherwise>
        </xsl:choose>
      </xsl:attribute>
      <xsl:attribute name="ClientName">XXXX</xsl:attribute>
      <xsl:attribute name="Version">1.0</xsl:attribute>
      <xsl:attribute name="CreationSource">File</xsl:attribute>
      <xsl:attribute name="CreationTimestamp">
        <xsl:value-of select="script:getTimestamp()"/>
      </xsl:attribute>
      <xsl:call-template name="InvAdjData"/>
    </EnterpriseDocument>
  </xsl:template>

  <xsl:template name="InvAdjData">
      <xsl:for-each select="//Document/RawXMLRow[not(RebateInvoiceID=preceding-sibling::RawXMLRow/RebateInvoiceID)]">
        <xsl:sort select="RebateInvoiceID"/>
        <RebateInvoice>
          <xsl:attribute name="RebateInvoiceID">
            <xsl:value-of select="RebateInvoiceID"/>
          </xsl:attribute>
          <xsl:variable name="InvoiceID">
            <xsl:value-of select="RebateInvoiceID"/>
          </xsl:variable>
          <xsl:for-each select="//Document/RawXMLRow[not(RebateEventID=preceding-sibling::RawXMLRow[RebateInvoiceID=$InvoiceID]/RebateEventID)]">
            <xsl:if test="RebateInvoiceID=$InvoiceID">
              <xsl:variable name="EventID">
                <xsl:value-of select="RebateEventID"/>
              </xsl:variable>
              <RebateProgram>
                <xsl:attribute name="RebateEventID">
                  <xsl:value-of select="RebateEventID"/>
                </xsl:attribute>
                <xsl:for-each select="//Document/RawXMLRow[not(BusinessUnitCode=preceding-sibling::RawXMLRow[RebateInvoiceID=$InvoiceID and RebateEventID=$EventID]/BusinessUnitCode)]">
                  <xsl:if test="RebateInvoiceID=$InvoiceID and RebateEventID=$EventID">
                    <xsl:variable name="BUCode">
                      <xsl:value-of select="BusinessUnitCode" />
                    </xsl:variable>
                    <BusinessUnit>
                      <xsl:attribute name="BusinessUnitCode">
                      <xsl:value-of select="BusinessUnitCode"/>
                    </xsl:attribute>

                      <xsl:for-each select="//Document/RawXMLRow[not(CategoryID=preceding-sibling::RawXMLRow[RebateInvoiceID=$InvoiceID and RebateEventID=$EventID and BusinessUnitCode=$BUCode]/CategoryID)]">
                        <xsl:if test="RebateInvoiceID=$InvoiceID and RebateEventID=$EventID and BusinessUnitCode=$BUCode">
                          <ItemCategoryPayment>

                            <xsl:attribute name="CategoryID">
                              <xsl:value-of select="CategoryID"/>
                            </xsl:attribute>
                            <xsl:attribute name="PaymentAmount">
                              <xsl:value-of select="PaymentAmount"/>
                            </xsl:attribute>
                          </ItemCategoryPayment>
                        </xsl:if>
                      </xsl:for-each>
                    </BusinessUnit >
                    </xsl:if>
                  
                </xsl:for-each>
             
              </RebateProgram >
            </xsl:if>
          </xsl:for-each>
        </RebateInvoice >
      </xsl:for-each>

  </xsl:template>

  <!-- BEGIN JSCRIPT HELPER CODE, KEEP THIS SECTION AS SMALL AS POSSIBLE IT'S A PERFORMANCE HOG -->
  <msxsl:script language="JScript" implements-prefix="script">
    <![CDATA[

function getTimestamp()
{
  var d = new Date();
  var m, dy, hr, mn, se;

  if (d.getMonth()+1 < 10)
  {
    m = "0"+(d.getMonth()+1);
  }
  else if (d.getMonth()+1 > 9)
  {
    m = d.getMonth()+1;
  }

  if (d.getDate() < 10)
  {
    dy = "0"+(d.getDate());
  }
  else if (d.getDate() > 9)
  {
    dy = d.getDate();
  }

  if (d.getHours() < 10)
  {
    hr = "0"+(d.getHours());
  }
  else if (d.getHours() > 9)
  {
    hr = d.getHours();
  }

  if (d.getMinutes() < 10)
  {
    mn = "0"+(d.getMinutes());
  }
  else if (d.getMinutes() > 9)
  {
    mn = d.getMinutes();
  }

  if (d.getSeconds() < 10)
  {
    se = "0"+(d.getSeconds());
  }
  else if (d.getSeconds() > 9)
  {
    se = d.getSeconds();
  }

  return d.getFullYear()+"-"+ m +"-"+ dy +"T"+ hr +":"+ mn +":"+ se;
}

]]>
  </msxsl:script>
</xsl:stylesheet>
Desired output :
Code:
- <EnterpriseDocument InterfaceName="RebateInvoiceAdjustmentImport" ClientID="1000001" ClientName="XXXX" Version="1.0" CreationSource="File" CreationTimestamp="2012-05-14T15:33:19" xmlns:script="script">
- <RebateInvoice RebateInvoiceID="1001878">
- <RebateProgram RebateEventID="1003042">
- <BusinessUnit BusinessUnitCode="0402">
  <ItemCategoryPayment CategoryID="1000057" PaymentAmount="89" /> 
  </BusinessUnit>
- <BusinessUnit BusinessUnitCode="0405">
  <ItemCategoryPayment CategoryID="1000057" PaymentAmount="94.42" /> 
  </BusinessUnit>
  </RebateProgram>
- <RebateProgram RebateEventID="1003043">
- <BusinessUnit BusinessUnitCode="0406">
  <ItemCategoryPayment CategoryID="1000057" PaymentAmount="147.5" /> 
  </BusinessUnit>
  </RebateProgram>
- <RebateProgram RebateEventID="1003048">
- <BusinessUnit BusinessUnitCode="0423">
  <ItemCategoryPayment CategoryID="1000057" PaymentAmount="97.36" /> 
  </BusinessUnit>
  </RebateProgram>
  </RebateInvoice>
- <RebateInvoice RebateInvoiceID="1001879">
- <RebateProgram RebateEventID="1008042">
- <BusinessUnit BusinessUnitCode="0433">
  <ItemCategoryPayment CategoryID="1000057" PaymentAmount="89" /> 
  </BusinessUnit>
- <BusinessUnit BusinessUnitCode="0434">
  <ItemCategoryPayment CategoryID="1000057" PaymentAmount="70.24" /> 
  </BusinessUnit>
  </RebateProgram>
- <RebateProgram RebateEventID="1008942">
- <BusinessUnit BusinessUnitCode="0435">
  <ItemCategoryPayment CategoryID="1000057" PaymentAmount="53.08" /> 
  </BusinessUnit>
  </RebateProgram>
  </RebateInvoice>
- <RebateInvoice RebateInvoiceID="1001978">
- <RebateProgram RebateEventID="2003042">
- <BusinessUnit BusinessUnitCode="0437">
  <ItemCategoryPayment CategoryID="1000057" PaymentAmount="127.85" /> 
  </BusinessUnit>
- <BusinessUnit BusinessUnitCode="0438">
  <ItemCategoryPayment CategoryID="1000057" PaymentAmount="180.04" /> 
  </BusinessUnit>
  </RebateProgram>
- <RebateProgram RebateEventID="3003042">
- <BusinessUnit BusinessUnitCode="0446">
  <ItemCategoryPayment CategoryID="1000057" PaymentAmount="146.61" /> 
  </BusinessUnit>
- <BusinessUnit BusinessUnitCode="0448">
  <ItemCategoryPayment CategoryID="1000057" PaymentAmount="76.56" /> 
  </BusinessUnit>
  </RebateProgram>
  </RebateInvoice>
  </EnterpriseDocument>
Thanks....
 


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are Off
Pingbacks are On
Refbacks are Off

Similar Threads
Thread Thread Starter Forum Replies Last Post
implement in XSLT scubin XSLT 5 November 18th, 2009 12:44 AM
Not able to implement the given logic in my XSLT ashyabhi_hp XSLT 2 January 27th, 2006 06:24 AM
Grouping Reports ( Urgent ) Aal Pro VB 6 0 November 27th, 2004 09:37 AM
Grouping XML by Muenchian Method - Urgent :-( xrow XSLT 5 September 28th, 2004 04:07 AM
Urgent: Implement Cascade Delete through Code rcmetta BOOK: Professional Crystal Reports for VS.NET 0 June 7th, 2004 12:49 AM



All times are GMT -4. The time now is 10:56 AM.


Powered by vBulletin®
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
© 2013 John Wiley & Sons, Inc.