Преобразование из электронной таблицы в списки списков в XML - PullRequest
2 голосов
/ 28 июля 2011

Я пытаюсь экспортировать электронную таблицу в определенный формат XML, чтобы импортировать ее в PDF-форму. Я продвинулся довольно далеко самостоятельно, но застрял в том, что, кажется, приближается к концу. (Имейте в виду, я не очень хорошо разбираюсь в программировании, и мой опыт работы с XML / XSLT ограничен этим проектом)

Сначала я экспортировал примерный набор данных из PDF, который дал мне представление о том, что я ищу. Затем я импортировал это в Excel и получил электронную таблицу из данных. Это позволило мне легко редактировать данные, а затем теоретически экспортировать их обратно, но ... Excel не экспортировал карту XML, созданную при импорте, из-за проблемы со списками списков. Это привело меня к тому, что я поместил таблицу в OpenOffice (технически LibreOffice) и попробовал фильтр экспорта XML с использованием XSLT.

Мои данные в электронной таблице выглядят как ...

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 более вероятен). Я искал ответы, но ничто не отвечало моим потребностям. Заранее спасибо.

1 Ответ

0 голосов
/ 06 августа 2011

если вы используете 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>
...