从电子表格转换为 xml 中的列表列表
Posted
技术标签:
【中文标题】从电子表格转换为 xml 中的列表列表【英文标题】:Converting from spreadsheet to a lists of lists in xml 【发布时间】:2011-07-28 12:58:05 【问题描述】:我正在尝试将电子表格导出到要导入 pdf 表单的特定 xml 布局。我自己已经走了很远,但被困在似乎接近尾声的地方。 (请注意,我对编程的东西不是很精通,我对 XML/XSLT 的经验仅限于这个项目)
首先,我从 pdf 中导出了一组示例数据,这让我知道了我在寻找什么。然后我将其导入 Excel 并从数据中获取电子表格。这让我可以轻松地编辑数据,然后理论上将其导出回来,但是......由于“列表列表”问题,Excel 不会导出它在导入时创建的 XML 映射。这导致我将电子表格放入 OpenOffice(技术上是 LibreOffice)并尝试使用 XSLT 的 XML 导出过滤器。
我在电子表格中的数据看起来像...
Type Name Compound Weight Material Weight
AAA BBB X 5 s 2
AAA BBB X 5 t 3
AAA BBB Y 4 r 4
我需要将其导出为...
<?xml version="1.0" encoding="UTF-8" ?>
- <MCD Type="AAA" Name="BBB">
- <Product Compound="X">
<Amount weight="5"/>
- <HM Material="s">
<Amount weight="2" />
</HM>
- <HM Material="t">
<Amount weight="3" />
</HM>
</Product>
- <Product Compound="Y">
<Amount weight="4"/>
- <HM Material="r">
<Amount weight="4" />
</HM>
</Product>
</MCD>
但是使用我当前的 XSL,我得到的东西更像......
<?xml version="1.0" encoding="UTF-8" ?>
- <MCD Type="AAA" Name="BBB">
- <Product Compound="X">
<Amount weight="5"/>
- <HM Material="s">
<Amount weight="2" />
</HM>
</Product>
</MCD>
- <MCD Type="AAA" Name="BBB">
- <Product Compound="X">
- <HM Material="t">
<Amount weight="3" />
</HM>
</Product>
</MCD>
- <MCD Type="AAA" Name="BBB">
- <Product Compound="Y">
<Amount weight="4"/>
- <HM Material="r">
<Amount weight="4" />
</HM>
</Product>
</MCD>
我的问题在于电子表格的每个单元格都在输出中。我希望仅在父单元格发生更改时才对其进行播放,例如在文件夹树中。我希望这是有道理的,有人可以帮助我(让它在 excel 或 openoffice 中工作,尽管从我的搜索看来,OpenOffice 路线更有可能)。我已经寻找答案,但没有什么能完全满足我的需求。提前谢谢你。
【问题讨论】:
您能否将示例简化为易于理解的内容,最好不要滚动,例如,使用具有 A、B、C、1、2、3 和更少列的表格?此外,如果您可以显示“我得到了这个 XML,我想得到这个”,那也可能会有所帮助。 我当然可以让它更简单。抱歉,我没有太多的编码经验或寻求帮助。希望现在更好。如果还有什么我可以帮助您帮助我的,尽管问。 开放式办公室有什么用?您是否只是为了将给定的 CSV 文件转换为 XML?还请指明目标 XSLT 版本。 我在 libreoffice 3.4.1 中有一个电子表格(基本上与 openoffice 相同),并且正在使用导出过滤器将文件写入 XML。现在它被保存为 ods 文件,虽然保存为 csv 让我的生活更轻松,但我并不反对。老实说,我不太确定,但我认为它是 v1 那么,输入是什么:ods 还是 csv? 【参考方案1】:如果您使用的是 XSLT 2,则从上一个 XML 开始并使用以下样式表:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each-group select="//MCD" group-by="concat(@Type,'-',@Name)">
<MCD Type="@Type" Name="@Name">
<xsl:for-each select="//Product[(parent::MCD/@Type = substring-before(current-grouping-key(),'-')) and (parent::MCD/@Name = substring-after(current-grouping-key(),'-'))]">
<xsl:copy-of select="." />
</xsl:for-each>
</MCD>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
你会得到:
<?xml version="1.0" encoding="UTF-8"?><MCD Type="AAA" Name="BBB"><Product Compound="X">
<Amount weight="5"/>
<HM Material="s">
<Amount weight="2"/>
</HM>
</Product><Product Compound="X">
<HM Material="t">
<Amount weight="3"/>
</HM>
</Product><Product Compound="Y">
<Amount weight="4"/>
<HM Material="r">
<Amount weight="4"/>
</HM>
</Product></MCD>
【讨论】:
以上是关于从电子表格转换为 xml 中的列表列表的主要内容,如果未能解决你的问题,请参考以下文章