2012-05-03 24 views
0

我是新來的這個Java腳本和xsl。 我們使用.js將.csv文件轉換爲xml,使用.js代碼中的xsl。使用.JS和XSL的性能和轉換問題

它創造了很多性能問題,它不會爲某些.csv文件創建任何xml文件。任何幫助將非常感激。

showAbsolutePath("InvoiceAdjustment.js"); 

function showAbsolutePath(path) 
{ 
var fso = new ActiveXObject("Scripting.FileSystemObject"); 
var s = ""; 
s += fso.GetAbsolutePathName(path); 

var foldername = s.substring(0,s.indexOf(path,0)); 
showFolderFileList(foldername); 
} 

function showFolderFileList(foldername) 
{ 
    var fso, f, fc, filename; 

fso = new ActiveXObject("Scripting.FileSystemObject"); 
    f = fso.GetFolder(foldername); 
fc = new Enumerator(f.files); 

for (; !fc.atEnd(); fc.moveNext()) 
{ 
    filename = ""; 
    filename += fc.item(); 

    if (filename.slice(-4) == ".csv") 
    { 
    convertCSVtoXML(foldername, filename); 
    } 
    } 

    fso = null; 
    } 

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); 
    } 

    function getTimestamp() 
    { 
    var d = new Date(); 
    var mm = padZeros(d.getMonth()+1); 
    var dd = padZeros(d.getDate()); 
    var hh = padZeros(d.getHours()); 
    var mn = padZeros(d.getMinutes()); 
    var ss = padZeros(d.getSeconds()); 

    return d.getFullYear()+"-"+ mm +"-"+ dd +"T"+ hh +":"+ mm +":"+ ss; 
    } 

    function padZeros(s) 
    { 
     if (s < 10) 
     { 
     s = "0" + s; 
      } 
     return(s); 
      } 

     function getDate(stringDate) 
     { 
     var a = String(stringDate).split("/"); 
     var strXML ; 

      strDate = "" ; 

     for (var i = 0 ; i < a.length; i++) 
     { 
     if (a[i].length == 1) 
    strDate += "0" + a[i]; 
     else 
    strDate += a[i]; 
      } 

     strDate += "" ; 

     return strDate; 
     } 


    /* code for xsl */ 
     <?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> 

我不知道如何附加我的.csv文件。但是,這個代碼有什麼辦法可以讓它變得更好?請分享你的想法。

/*樣品.csv文件數據*/ RebateInvoiceID RebateEventID BusinessUnitCode類別ID PaymentAmount 1001655 1002652 406 1000043 696.81 1001655 1002650 423 1000043 8.85 1001655 1002652 423 1000043 443.39 1001655 1002650 433 1000043 15.93 3001655 8002652 433 1000043 432.29 3001655 8002652 1000043 434 55.46 3001655 8002653 434 1000043 590.6 3001655 8002653 435 1000043 10.03 5001655 2002652 435 1000043 329.31 5001655 2002652 436 1000043 21.83 5001655 2002655 436 1000043 501.71 5001655 2002655 437 1000043 32.45 5001655 2002655 437 1000043 674.81

回答

0

此代碼:

<xsl:for-each select="//Document/RawXMLRow[not(RebateInvoiceID=preceding- 
      sibling::RawXMLRow/RebateInvoiceID)]"> 
,其重複出現

,是這樣做的分組的非常低效的方式(或重複的消除) - 性能是在二次數據中的行數。假設你停留在XSLT 1.0中,請使用鍵查看Muenchian分組。

+0

Hi Micheal ...感謝您的回覆。我使用密鑰在線檢查了Muenchian分組,但大多數解釋的示例都有一個輸入xml文件。我的輸入文件是.csv – user1371259