在xslt中将XML转换为CSV

时间:2015-02-27 07:10:43

标签: xslt

您好我是xslt样式表的新手。我已经浏览了将XML转换为CSV文件的所有帖子。但我真正需要的是下面的内容。

我的XML数据。

<EmployeeDetails>

<EmployeeName>ABC</EmployeeName>

<EmployeeID>123</EmployeeID>

<EmployeeName>DEF</EmployeeName>

<EmployeeID>456</EmployeeID>

<EmployeeName>GHI</EmployeeName>

<EmployeeID>789</EmployeeID>

</EmployeeDetails>

我需要输出

<Result>ABC,DEF,GHI</Result>

感谢任何帮助。

由于

3 个答案:

答案 0 :(得分:1)

不确定你有哪些工具可用,但我写了一个简单的函数来完成你在c#中提出的要求。

 private void ProcessXML2(Object stateInfo)
    {
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.DtdProcessing = DtdProcessing.Parse;
        XmlReader reader = XmlReader.Create(AppDomain.CurrentDomain.BaseDirectory + "data.xml", settings);

        StringBuilder sb = new StringBuilder();

        sb.Append("<Result>");

        string xmlEmployeeName = String.Empty;

        reader.MoveToContent();

        while (reader.Read())
        {
               if(reader.NodeType == XmlNodeType.Element)
               {
                    if (reader.Name == "EmployeeName")
                    {
                        while ((reader.NodeType != XmlNodeType.Text))
                        {
                            reader.Read();
                        }
                        if (reader.NodeType == XmlNodeType.Text)
                            if (reader.Value != null)
                            {
                                sb.Append(reader.Value + ",");
                            }
                    }  
               }
        }

        sb.Append("</Result>");

        using (StreamWriter sw = File.CreateText(AppDomain.CurrentDomain.BaseDirectory + "output.csv"))
        {
            sw.Write(sb);
            sb.Clear();
            sw.Close();
        }
    }

如果您能够使用C#,则可以调整此方法以使其更干净。我已经用你帖子中的输入和输出对此进行了测试。

答案 1 :(得分:1)

我不会称之为csv,但以下样式表可以完成这项工作:

<?xml version="1.0" encoding="ASCII"?>
<xsl:stylesheet
 version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 >

<xsl:output method='xml' />
<xsl:template match="/">
<xsl:apply-templates select="EmployeeDetails"/>
</xsl:template>
<xsl:template match="EmployeeDetails">
<Result><xsl:for-each select="EmployeeName">
<xsl:if test="position()&gt;1">,</xsl:if>
<xsl:value-of select="text()"/>
</xsl:for-each></Result>
</xsl:template>
</xsl:stylesheet>

$ xsltproc a.xsl b.xml
<?xml version="1.0"?>
<Result>ABC,DEF,GHI</Result>

答案 2 :(得分:1)

下面有点清洁的XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">

<xsl:output method="xml" indent="no" encoding="UTF-8"/>

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="EmployeeDetails">
    <Result>
        <xsl:apply-templates/>
    </Result>
</xsl:template>

<xsl:template match="EmployeeName">
    <xsl:apply-templates/>
    <xsl:if test="following-sibling::EmployeeName">
        <xsl:text>,</xsl:text>
    </xsl:if>
</xsl:template>

<xsl:template match="EmployeeID"/>

</xsl:stylesheet>