我是这个java脚本和xsl的新手。 我们使用.js将.csv文件转换为xml,使用.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 CategoryID 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 434 1000043 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 :(得分:0)
此代码:
<xsl:for-each select="//Document/RawXMLRow[not(RebateInvoiceID=preceding-
sibling::RawXMLRow/RebateInvoiceID)]">
重复出现的是一种非常低效的分组(或消除重复)的方法 - 性能是数据中行数的二次方。假设您遇到了XSLT 1.0,请使用密钥查看Muenchian分组。