2

我正在尝试将电子表格导出到要导入 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 路线更有可能)。我已经寻找答案,但没有什么能完全满足我的需求。先感谢您。

4

1 回答 1

0

如果您使用的是 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>
于 2011-08-06T17:13:23.763 回答