如何编写XSLT将XML转换为CSV? [英] How do I write an XSLT to transform XML to CSV?

查看:264
本文介绍了如何编写XSLT将XML转换为CSV?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图写一个XSLT,它会将我已经转换为CSV文件的XML文档。下面是一个XML示例:

 <?xml version =1.0encoding = utf-8?> 
< Import>
< Users>
< User ID =user_1EmailAddress =johndoe@somewhere.com>
< Contact FirstName =JohnLastName =Doe/>
< Address Street1 =808 Elm StCity =AnywhereState =NY/>
< / User>

< User ID =user_2EmailAddress =janenoone@somewhere.com>
< Contact FirstName =JaneLastName =Noone/>
< Address Street1 =123 Some RdCity =AnywhereState =NY/>
< / User>
< / Users>
< / Import>

我想要的是一个XSLT,输出结果如下:

  John,Doe,808 Elm St,Anywhere,NY 
Jane,Noone,123 Some Rd,Anywhere,NY

我想我有C#代码正确启动转换,但为了防止我不,该代码:

  using System; 
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Xsl;
using System.Configuration;

命名空间UserTransform
{
class Program
{
static void Main(string [] args)
{
string oldXML = ConfigurationSettings.AppSettings [XMLToBeTransformed];
string xsltLocation = ConfigurationSettings.AppSettings [XSLTfile];
string newCSV = ConfigurationSettings.AppSettings [NewCSVLocation];

XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(xsltLocation);
transform.Transform(oldXML,newCSV);
}
}
}


解决方案>

创建一个与所有用户匹配的模板,然后按照您想要的顺序提取所需的信息:

 < ; xsl:template match =// User> 
< xsl:value-of select =Contact / @ FirstName/>,
< xsl:value-of select =Contact / @ LastName/>,
<! - etc - >
< / xsl:template>

显然,你需要确保空格按你想要的方式处理,在正确的地方。我会把这个练习留给读者。


I'm trying to write an XSLT that will transform an XML document that I have to a CSV file. Here's a sample of the XML:

<?xml version="1.0" encoding="utf-8"?>
<Import>
    <Users>
        <User ID="user_1" EmailAddress="johndoe@somewhere.com">
            <Contact FirstName="John" LastName="Doe" />
            <Address Street1="808 Elm St" City="Anywhere" State="NY" />
        </User>

        <User ID="user_2" EmailAddress="janenoone@somewhere.com">
            <Contact FirstName="Jane" LastName="Noone" />
            <Address Street1="123 Some Rd" City="Anywhere" State="NY" />
        </User>     
    </Users>
</Import>

What I want is an XSLT that will output like so:

John,Doe,808 Elm St,Anywhere,NY
Jane,Noone,123 Some Rd,Anywhere,NY

I think I have the C# code correct to initiate the transform, but just in case I don't, here's that code as well:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Xsl;
using System.Configuration;

namespace UserTransform
{
    class Program
    {
        static void Main(string[] args)
        {
            string oldXML = ConfigurationSettings.AppSettings["XMLToBeTransformed"];
            string xsltLocation = ConfigurationSettings.AppSettings["XSLTfile"];
            string newCSV = ConfigurationSettings.AppSettings["NewCSVLocation"];

            XslCompiledTransform transform = new XslCompiledTransform();
            transform.Load(xsltLocation);
            transform.Transform(oldXML, newCSV);
        }
    }
}

解决方案

Create a template that matches all users, then pull out the information you need in the order you want:

<xsl:template match="//User">
  <xsl:value-of select="Contact/@FirstName"/>,
  <xsl:value-of select="Contact/@LastName"/>,
  <!--etc-->
</xsl:template>

Obviously you'll need to make sure whitespace is handled the way you want it to be, with newlines in the right places. I'll leave this as an exercise to the reader.

这篇关于如何编写XSLT将XML转换为CSV?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆