使用XSL进行XML到CSV的动态转换 - 无法获取标记名称

时间:2014-06-11 09:58:20

标签: java xml xslt csv

我正在尝试使用Java代码动态地将XML文件转换为CSV文件。我能够获得转换为CSV的数据,但问题在于Header行。我需要将第一行添加到具有该列名称的CSV文件中。

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

这是我的示例XML:

<record>
 <column name="ID">537316</column>
 <column name="TYPE">MANUAL</column>
 <column name="SECONDID" />
 <column name="KEY">345</column>
</record>

这是我的XSL文件:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/*">
<xsl:for-each select="*[1]/*">
<xsl:value-of select="name()"/>
<xsl:if test="position() != last()">, </xsl:if>
<xsl:if test="position() = last()">
<xsl:text>&#xD;</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:template>
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:param name="fieldNames" select="'yes'" />
<xsl:strip-space elements="*" />
<xsl:template match="/*/child::*">
<xsl:for-each select="child::*">
<xsl:if test="position() != last()"><xsl:value-of select="normalize-space(.)"/>, </xsl:if>
<xsl:if test="position() = last()"><xsl:value-of select="normalize-space  (.)"/><xsl:text>&#xD;</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

示例输出应为:

ID,TYPE,SECONDID,KEY\n
537316,MANUAL,,345\n

问题是,XML文件是一个数据库输出,会动态变化,所以我需要动态获取标签名称。

Here using  <xsl:value-of select="name()"/>

我将标签名称作为ID,TYPE等的列。 除了name()之外还有其他方法,以便我可以从XML中获取正确的标记名称。

1 个答案:

答案 0 :(得分:3)

  

除了name()之外还有其他任何方法,以便我可以获得   正确的XML标记名称。

您不需要标记名称,您需要name 属性的值。这可以通过以下方式返回:

<xsl:value-of select="@name"/>