XML到CSV代码格式

XML到CSV代码格式,xml,csv,Xml,Csv,我不是一个熟练的xml开发人员,我已经成功地将xsl代码构造得恰到好处。我正在遍历节点并正确地从子节点获取数据,但没有得到所需的结果。这是我的xml,也可以在这里找到: 但正如您在上面的输出中看到的,第二行子元素应该具有相同的行数据(前4列)。在下面所示的示例中,这是我期望的输出(期望的)。我希望有人能告诉我哪里出了问题 Activ,Date,ExpectedHours,TotalHours,CaseGUID,GUID,InvoiceGUID,UserGUID,WorkTypeGUID

我不是一个熟练的xml开发人员,我已经成功地将xsl代码构造得恰到好处。我正在遍历节点并正确地从子节点获取数据,但没有得到所需的结果。这是我的xml,也可以在这里找到:

但正如您在上面的输出中看到的,第二行子元素应该具有相同的行数据(前4列)。在下面所示的示例中,这是我期望的输出(期望的)。我希望有人能告诉我哪里出了问题

Activ,Date,ExpectedHours,TotalHours,CaseGUID,GUID,InvoiceGUID,UserGUID,WorkTypeGUID                               
test1,12-01-12,9,10,3fee9c7,kfsdsdlf,a2d169,4b4328,31566
test1,12-01-12,9,10,3fee9c7,aaaaa,bbbbbb,ccccc,ddddd,eeeee
....
test4,13-01-09,1,4,3fee9c790,kfsdsdlfk,a2d16,4b43281a,31566f
test4,13-01-09,1,4,aaaaa,bbbbbb,ccccc,ddddd,eeeee

如果您的过程正常,只需添加一个步骤即可删除空格:

string undesired = @" Activi,Date,ExpectedHours,TotalHrs,CaseGUID,GUID,InvoiceGUID,UserGUID,WorkTypeGUID
test1,12-01-12,9,10,    3fee9c7 ,kfsdsdlf   ,a2d169 ,4b4328 ,31566
        1111    ,2222   ,3333   ,4444   ,5555
test2,13-01-09,3,5, 3fee9c79c,kfsdsdl   ,a2d169c  ,4b43281  ,31566f
        3fee9c7s    ,kfsdsd4    ,a2d16s ,4b43281ab  ,31566s6
test3,13-01-09,1,4,    
test4,13-01-09,1,4, 3fee9c790  ,kfsdsdlfk  ,a2d16  ,4b43281a   ,31566f
        aaaaa   ,bbbbbb ,ccccc  ,ddddd  ,eeeee";


string trimmed = undesired.Replace(" ", string.Empty);
Console.WriteLine(trimmed);
您将获得以下输出:

Activi,Date,ExpectedHours,TotalHrs,CaseGUID,GUID,InvoiceGUID,UserGUID,WorkTypeGUID
test1,12-01-12,9,10,3fee9c7,kfsdsdlf,a2d169,4b4328,31566
1111,2222,3333,4444,5555
test2,13-01-09,3,5,3fee9c79c,kfsdsdl,a2d169c,4b43281,31566f
3fee9c7s,kfsdsd4,a2d16s,4b43281ab,31566s6
test3,13-01-09,1,4,
test4,13-01-09,1,4,3fee9c790,kfsdsdlfk,a2d16,4b43281a,31566f
aaaaa,bbbbbb,ccccc,ddddd,eeeee
试试这个:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>

    <xsl:template match="/">
        <!-- Output the CSV header -->
        <xsl:text>Activities,Date,CaseGUID,GUID</xsl:text>
        <xsl:text>&#xA;</xsl:text>

        <!-- Output the values -->
        <xsl:for-each select="//WorkDayInfo">
            <xsl:variable name="head">
                <xsl:value-of select="concat(Activities,',',Date)"/>
            </xsl:variable>

            <xsl:for-each select="./Entries">
                <xsl:if test="count(*) = 0">
                    <xsl:value-of select="$head"/>
                    <xsl:text>&#xA;</xsl:text>
                </xsl:if>

                <xsl:for-each select="./HourEntry">
                    <xsl:value-of select="$head"/>
                    <xsl:text>,</xsl:text>
                    <xsl:value-of select="concat(CaseGUID,',',GUID)"/>
                    <xsl:text>&#xA;</xsl:text>
                </xsl:for-each>
            </xsl:for-each>

        </xsl:for-each>

    </xsl:template>
</xsl:stylesheet>

活动、日期、案例GUID、GUID

;

;
,

;

您是否有兴趣将
xml
转换为
csv
?如果是,请看:@hdoghman,您好,我已经可以将xml转换为csv了。正如您可以从输出中看到的那样。我只是需要一些帮助来格式化我的xsl,因为它没有提供我想要的输出。您是否尝试删除空格:
string trimmed=yourResult.Replace(“,string.Empty”)?不,我没有,我不知道怎么做,因为我说我是一个全新的xml。@hdogmen谢谢,伙计,我可以解决这个问题,但我的问题下一个问题是最大的,那就是如何得到这个结果:Activ,Date,ExpectedHours,TotalHours,CaseGUID,GUID,InvoiceGUID,UserGUID,WorkTypeGUID test1,12-01-12,9,10,3fee9c7,kfsdlf,a2d169,4B432831566测试1,12-01-12,9,10,3fee9c7,AAAA,bbbbbb,ccccc,ddddd,EEEE谢谢@jongware的提示。谢谢!这就是我要找的!!对请求进行一次小的更新,我只想选择少数列,只输出选定的标题,例如caseGUID和UserGuid,我如何标记它?@Niki-请参阅更新。我举了一个很简单的例子。我只是想说谢谢你的帮助,
string undesired = @" Activi,Date,ExpectedHours,TotalHrs,CaseGUID,GUID,InvoiceGUID,UserGUID,WorkTypeGUID
test1,12-01-12,9,10,    3fee9c7 ,kfsdsdlf   ,a2d169 ,4b4328 ,31566
        1111    ,2222   ,3333   ,4444   ,5555
test2,13-01-09,3,5, 3fee9c79c,kfsdsdl   ,a2d169c  ,4b43281  ,31566f
        3fee9c7s    ,kfsdsd4    ,a2d16s ,4b43281ab  ,31566s6
test3,13-01-09,1,4,    
test4,13-01-09,1,4, 3fee9c790  ,kfsdsdlfk  ,a2d16  ,4b43281a   ,31566f
        aaaaa   ,bbbbbb ,ccccc  ,ddddd  ,eeeee";


string trimmed = undesired.Replace(" ", string.Empty);
Console.WriteLine(trimmed);
Activi,Date,ExpectedHours,TotalHrs,CaseGUID,GUID,InvoiceGUID,UserGUID,WorkTypeGUID
test1,12-01-12,9,10,3fee9c7,kfsdsdlf,a2d169,4b4328,31566
1111,2222,3333,4444,5555
test2,13-01-09,3,5,3fee9c79c,kfsdsdl,a2d169c,4b43281,31566f
3fee9c7s,kfsdsd4,a2d16s,4b43281ab,31566s6
test3,13-01-09,1,4,
test4,13-01-09,1,4,3fee9c790,kfsdsdlfk,a2d16,4b43281a,31566f
aaaaa,bbbbbb,ccccc,ddddd,eeeee
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>

    <xsl:template match="/">
        <!-- Output the CSV header -->
        <xsl:text>Activities,Date,CaseGUID,GUID</xsl:text>
        <xsl:text>&#xA;</xsl:text>

        <!-- Output the values -->
        <xsl:for-each select="//WorkDayInfo">
            <xsl:variable name="head">
                <xsl:value-of select="concat(Activities,',',Date)"/>
            </xsl:variable>

            <xsl:for-each select="./Entries">
                <xsl:if test="count(*) = 0">
                    <xsl:value-of select="$head"/>
                    <xsl:text>&#xA;</xsl:text>
                </xsl:if>

                <xsl:for-each select="./HourEntry">
                    <xsl:value-of select="$head"/>
                    <xsl:text>,</xsl:text>
                    <xsl:value-of select="concat(CaseGUID,',',GUID)"/>
                    <xsl:text>&#xA;</xsl:text>
                </xsl:for-each>
            </xsl:for-each>

        </xsl:for-each>

    </xsl:template>
</xsl:stylesheet>