gpt4 book ai didi

java - XML 转换为 CSV

转载 作者:行者123 更新时间:2023-12-01 09:07:38 25 4
gpt4 key购买 nike

<?xml version="1.0" encoding="UTF-8"?>
<FirstTag version="1.0" createTime="15:59:59" DATE="20161209">
<SecondTag Name="House01">
<a>
<Furniture FURN_ID="FUR00001" FURN_AMT="2" price="10000"/>
<Furniture FURN_ID="FUR00002" FURN_AMT="1" price="20000"/>
</a>
<b>
<Furniture FURN_ID="FUR00001" FURN_AMT="2" price="30000"/>
<Furniture FURN_ID="FUR00003" FURN_AMT="1" price="40000"/>
</b>
<c>
<Furniture FURN_ID="FUR00002" FURN_AMT="2" price="50000"/>
<Furniture FURN_ID="FUR00003" FURN_AMT="1" price="60000"/>
</c>
<d>
<Furniture FURN_ID="FUR00001" FURN_AMT="1" price="70000"/>
<Furniture FURN_ID="FUR00002" FURN_AMT="2" price="80000"/>
</d>
<e>
<Furniture FURN_ID="FUR00002" FURN_AMT="1" price="90000"/>
<Furniture FURN_ID="FUR00003" FURN_AMT="2" price="100000"/>
</e>
<f>
<Furniture FURN_ID="FUR00001" FURN_AMT="1" price="110000"/>
<Furniture FURN_ID="FUR00002" FURN_AMT="2" price="120000"/>
<Furniture FURN_ID="FUR00003" FURN_AMT="2" price="120000"/>
</f>
</SecondTag>
</FirstTag>

上面是我从 Java 程序生成的简单 xml(带有节点值)。重点是,我想将此 xml 数据发送到另一个应用程序,其中已经有一个来自 UI/批处理进程的 csv 加载函数。我听说过 XSLT,但从未使用过它,尝试了一些教程,但在将所有值放入 csv 时感到困惑。

这是 csv 中的样子(开始,成功后需要进行一些计算):

sample row csv

在这个例子中,在一所房子(HOUSE01)中,我想输出不同房间中的所有家具(即a是房间1,b是房间2,c是房间3等)。

我一直在尝试构建 XSLT,下面是 XSLT:

<?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" />

<xsl:template match="/">
<xsl:text>Name,Furn_Id,a,b,c,d,e,f
</xsl:text>
<xsl:variable name="delimiter" select="','" />

<xsl:for-each select="//SecondTag">
<xsl:variable name="hname" select="@Name"/>

<xsl:for-each select="f/Furniture">

<xsl:value-of select='$hname' />
<xsl:value-of select="$delimiter"/>

<xsl:variable name="var1" select="@FURN_ID"/>
<xsl:variable name="varamt1" select="@FURN_AMT"/>

<xsl:for-each select="//a/Furniture">


<xsl:variable name="var2" select="@FURN_ID"/>
<xsl:variable name="varamt2" select="@FURN_AMT"/>

<xsl:if test="$var1 = $var2">

<xsl:value-of select='$var2' />
<xsl:value-of select="$delimiter"/>
<xsl:value-of select='$varamt2' />
<xsl:value-of select="$delimiter"/>
</xsl:if>

</xsl:for-each>

<xsl:text>
</xsl:text>

</xsl:for-each>

</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

我正在使用其他页面的一些引用,并且可以构建一些简单的 XSLT 将 XML 转换为 CSV,但是,我需要一些指导才能解决我的主要 XML 问题。

将来在我可以获得循环内的节点值后,我想将每个房间的每件家具的总价格相加。

预期最终 csv 结果:

Name,Furn_Id,a,b,c,d,e,f
House01,FUR00001,20000,60000,,70000,,110000
House01,FUR00002,20000,,100000,160000,90000,240000
House01,FUR00003,,40000,60000,,200000,240000

谢谢。

Getting the value of an attribute in XML

最佳答案

这比看起来更复杂,因为您需要为当前房屋中的每个不同的 FURN_ID 分配一行(或者至少从给定的示例中看起来如此)。因此第一个任务是找到这些不同的 FURN_ID 值。

OTOH,如果每个房子都有完全相同的 6 个房间,那么在其匹配的列标题下显示每个家具的第二个任务就简单得多:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" encoding="UTF-8"/>

<xsl:key name="furn" match="Furniture" use="concat(@FURN_ID, '|', ../../@Name)" />

<xsl:template match="/FirstTag">
<xsl:for-each select="SecondTag">
<xsl:variable name="columns" select="*" />
<xsl:variable name="unique-rows" select="*/Furniture[count(. | key('furn', concat(@FURN_ID, '|', ../../@Name))[1]) = 1]"/>
<!-- header -->
<xsl:text>Name,Furn_Id,a,b,c,d,e,f&#10;</xsl:text>
<!-- rows -->
<xsl:for-each select="$unique-rows">
<xsl:value-of select="../../@Name"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="@FURN_ID"/>
<xsl:text>,</xsl:text>
<xsl:variable name="id" select="@FURN_ID" />
<xsl:for-each select="$columns">
<xsl:variable name="cell" select="Furniture[@FURN_ID=$id]" />
<xsl:if test="$cell">
<xsl:value-of select="$cell/@FURN_AMT * $cell/@price"/>
</xsl:if>
<xsl:if test="position()!=last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>&#10;</xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例,结果将是:

Name,Furn_Id,a,b,c,d,e,f
House01,FUR00001,20000,60000,,70000,,110000
House01,FUR00002,20000,,100000,160000,90000,240000
House01,FUR00003,,40000,60000,,200000,240000

这与您的预期输出略有不同,但我相信它是正确的。

关于java - XML 转换为 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41139314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com