使用 xslt 样式表将 xml 文档转换为逗号分隔 (CSV) 文件
我需要一些帮助,使用 xslt 样式表将 xml 文档转换为 CSV 文件。我正在尝试使用以下 xsl,但似乎无法正确执行。我希望我的逗号分隔文件包含列标题,后跟数据。我最大的问题是删除最后一项后的最后一个逗号并插入回车符,以便每组数据显示在单独的行上。我一直在使用 XML 记事本。
<xsl:template match="/">
<xsl:element name="table">
<xsl:apply-templates select="/*/*[1]" mode="header" />
<xsl:apply-templates select="/*/*" mode="row" />
</xsl:element>
</xsl:template>
<xsl:template match="*" mode="header">
<xsl:element name="tr">
<xsl:apply-templates select="./*" mode="column" />
</xsl:element>
</xsl:template>
<xsl:template match="*" mode="row">
<xsl:element name="tr">
<xsl:apply-templates select="./*" mode="node" />
</xsl:element>
</xsl:template>
<xsl:template match="*" mode="column">
<xsl:element name="th">
<xsl:value-of select="translate(name(.),'qwertyuiopasdfghjklzxcvbnm_','QWERTYUIOPASDFGHJKLZXCVBNM ')" />
</xsl:element>,
</xsl:template>
<xsl:template match="*" mode="node">
<xsl:element name="td">
<xsl:value-of select="." />
</xsl:element>,
</xsl:template>
I need some assistance converting an xml document to a CSV file using an xslt stylesheet. I am trying to use the following xsl and I can't seem to get it right. I want my comma delimited file to include column headings, followed by the data. My biggest issues are removing the final comma after the last item and inserting a carriage return so each group of data appears on a separate line. I have been using XML Notepad.
<xsl:template match="/">
<xsl:element name="table">
<xsl:apply-templates select="/*/*[1]" mode="header" />
<xsl:apply-templates select="/*/*" mode="row" />
</xsl:element>
</xsl:template>
<xsl:template match="*" mode="header">
<xsl:element name="tr">
<xsl:apply-templates select="./*" mode="column" />
</xsl:element>
</xsl:template>
<xsl:template match="*" mode="row">
<xsl:element name="tr">
<xsl:apply-templates select="./*" mode="node" />
</xsl:element>
</xsl:template>
<xsl:template match="*" mode="column">
<xsl:element name="th">
<xsl:value-of select="translate(name(.),'qwertyuiopasdfghjklzxcvbnm_','QWERTYUIOPASDFGHJKLZXCVBNM ')" />
</xsl:element>,
</xsl:template>
<xsl:template match="*" mode="node">
<xsl:element name="td">
<xsl:value-of select="." />
</xsl:element>,
</xsl:template>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我用它来简单的 XSLT 将 XML 转换为 CSV;它假设根节点的所有子节点都是 CSV 中的行,并将根节点的第一个子节点的元素名称作为字段名称。
所以这个 XML:
转换为:
不确定这是否有帮助,这取决于您的 XML 的布局方式。
编辑:这是一个更彻底的转换:
这将在 CSV 中为所有“行”中存在的所有标签名称创建一列,并填充每行中的相应列。
I use this to simple XSLT to convert XML to CSV; it assumes all child nodes of the root node are to be rows in the CSV, taking the element names of the first child of the root to be field names.
So this XML:
Converts to:
Not sure if this helps though, it depends how your XML is laid out.
Edit: Here's a more thorough transform:
This one will create a column in your CSV for all tag names that exist in all 'rows', and populate the appropriate column in each row.
我正在使用 @flynn1179 的答案中的 xslt 的“更彻底的转换”。但发现当行数增加时,需要花费大量时间。 (这是使用 oracle dbms_xmlgen xslt 转换)
我发现,因为我知道我的 2 个数据级别的名称(在本例中为 ROWSET 和 ROW),所以我能够优化 xslt 并获得显着的性能提升。
我的修改版本(专门针对oracle的dbms_xmlgen包)如下。它还包括我在互联网上找到的其他 csv 转换的位。
I was using the "more thorough transform" of the xslt from @flynn1179 's answer.. but found that it was taking an extraordinary amount of time when the number of rows increased. (this is using oracle dbms_xmlgen xslt transform )
I found that because I know what my 2 levels of data are called (ROWSET and ROW in this case) i was able to optimize the xslt and gain a significant performance increase.
My modified version (specifically aimed at oracle's dbms_xmlgen package) is below. it also includes bits from other csv transforms I found around the internet.