Таблица DOCX в XML с использованием XSL - PullRequest
0 голосов
/ 10 октября 2011

У меня есть файл docx с таблицей рабочего расписания, например:

        monday | tuesday | wednesday | thursday | friday | saturday | sunday
Peter     5    |   4     |           |    6     |   5    |          |   11
John      2    |         |    1      |    6     |   5    |     4    |
etc..

Я извлек документ.xml из документа и пытаюсь создать следующий XML-файл с использованием этого XML-файла.

<schedule>
   <monday>
     <shift name="Peter" time="5" />
     <shift name="John"  time="2" />
   </monday>
   <tuesday>
 etc...

Единственное, что я пока не знаю, как это сделать - это добавить смены в соответствующий день.Мне удалось получить xml:

<schedule>
   <monday>
     <shift name="Peter" time="5" />
   </monday>
   <monday>
     <shift name="John"  time="2" />
   </monday>
   <tuesday>
etc..

Как мне это исправить?

Вложения: document.xml (извлечено из документа) ЗДЕСЬ xslЯ создал ЗДЕСЬ

1 Ответ

0 голосов
/ 10 октября 2011

Примените к вашему текущему результату это преобразование (мюнхенская группировка) :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:key name="kDayByName" match="/*/*" use="name()"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/*/*"/>

 <xsl:template match=
  "/*/*[generate-id()
       =
        generate-id(key('kDayByName', name())[1])
       ]
  ">

  <xsl:copy>
    <xsl:apply-templates select=
        "key('kDayByName', name())/node()"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

при применении к этому документу XML :

<schedule>
    <monday>
        <shift name="Peter" time="5" />
    </monday>
    <monday>
        <shift name="John"  time="2" />
    </monday>
</schedule>

желаемый, правильный результат получается :

<schedule>
    <monday>
        <shift name="Peter" time="5" />
        <shift name="John" time="2" />
    </monday>
</schedule>
...