用于将XML转换为CSV的XSL:根据数据字段将报价添加到末尾

我正在尝试使用Java代码动态地将XML文件转换为CSV文件。 我能够获得转换为CSV的数据,但问题是我的数据是“”和“,”。

这是我的示例XML:

 537316 MANUAL 546 "THIS","IS",FOR,"TEST" 345  

这是Java代码:

 import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.w3c.dom.Document; class xmltocsv { public static void main(String args[]) throws Exception { File stylesheet = new File("C:/testxsl.xsl"); File xmlSource = new File("C:/test.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(xmlSource); StreamSource stylesource = new StreamSource(stylesheet); Transformer transformer = TransformerFactory.newInstance() .newTransformer(stylesource); Source source = new DOMSource(document); Result outputTarget = new StreamResult(new File("c:/output.csv")); transformer.transform(source, outputTarget); } } 

这是我的XSL文件:

    "  " ,  
          "", ""
     

示例输出应为:

 ID,TYPE,SECONDID,INFO,KEY "537316","MANUAL","546","THIS"",""IS"",FOR,""TEST""","345" 

但我得到的输出是:

 ID,TYPE,SECONDID,INFO,KEY\n "537316","MANUAL","546",""THIS","IS",FOR,"TEST"","345" 

我使用的XML来自数据库并包含特殊字符(“),它导致我的输出CSV中出现意外结果(因为我使用MS Excel打开输出CSV)。我需要validation数据是否有引号以及是否有引号我必须添加额外的引号才能获得所需的输出。有人可以帮我解决if条件,我可以在我的XSL中使用它来validation字符串并在数据中搜索(“”)。

以下样式表:

XSLT 1.0

     ID,TYPE,SECONDID,INFO,KEY
  "    "  ,      " ""                 

当应用于您的示例输入时,将产生以下输出:

 ID,TYPE,SECONDID,INFO,KEY "537316","MANUAL","546","""THIS"",""IS"",FOR,""TEST""","345" 

我认为这是CSV格式的输入数据的正确表示。

 class XmlToCsv { private static void emitHeaders( Node record ){ NodeList fields = record.getChildNodes(); String del = ""; for( int iField = 0; iField < fields.getLength(); iField++ ){ Node node = fields.item( iField ); if( ! ( node instanceof Element ) ) continue; System.out.print( del ); System.out.print( ((Element)node).getAttribute("name") ); del = ","; } System.out.println(); } private static void emitData( Node record ){ NodeList fields = record.getChildNodes(); String del = ""; for( int iField = 0; iField < fields.getLength(); iField++ ){ Node node = fields.item( iField ); if( ! ( node instanceof Element ) ) continue; System.out.print( del ); String cont = node.getTextContent(); cont = cont.replaceAll( "\"", "\"\"" ); System.out.print( '"' + cont + '"' ); del = ","; } System.out.println(); } public static void main(String args[]) throws Exception { File xmlSource = new File("test.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(xmlSource); Source source = new DOMSource(document); Element table = document.getDocumentElement(); NodeList records = table.getElementsByTagName("record"); emitHeaders( records.item( 0 ) ); for( int iRec = 0; iRec < records.getLength(); iRec++ ){ emitData( records.item( iRec ) ); } } } 

使用JAXB会更简单。

    "  " ,  
           "    " ,  ""
     " ""