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