Dzielenie XML na wiele plików za pomocą XSLT

Ciężko mi się skupić na XSLT, ale słyszałem, że można podzielić plik XML na wiele plików. Zasadniczo chciałbym skopiować wszystkie elementy do pierwszego pliku i po ostatnim pliku, a następnie dodać indywidualną zawartość pliku dla każdego pliku wyjściowego.

Czy ktoś mógłby mi dać jakieś wskazówki na ten temat, jeśli to nawet możliwe?

Dzięki,

Kompletna.xml

<rootelem>
  <elem>
    <file attr1='1'>
      <content>content file 1</content>
    </file>
    <file attr2='2'>
      <content>content file 2</content>
    </file>
    <file attr3='3'>
      <content>content file 3</content>
    </file>
  </elem>
</rootelem>

Wyjście:

Complete_PART1.xml

<rootelem>
  <elem>
     <file attr1='1'>
        <content>content file 1</content>
     </file>
  </elem>
</rootelem>

Complete_PART2.xml

<rootelem>
  <elem>
    <file attr2='2'>
      <content>content file 2</content>
    </file>
  </elem>
</rootelem>

Complete_PART3.xml

<rootelem>
  <elem>
     <file attr3='3'>
        <content>content file 3</content>
     </file>
  </elem>
</rootelem>
 29
Author: marc_s, 2010-10-27

3 answers

Odpowiadając na twój komentarz do odpowiedzi @Dimitre...

Napisałeś:

<xsl:template match="/">
  <xsl:for-each select="elem/file">
    <xsl:result-document method="xml" href="file_{@id}-output.xml">
      <xsl:copy-of select="."/>
    </xsl:result-document>
  </xsl:for-each>
</xsl:template> 

To nie do końca pasuje do twojego XML, który ma rootelem jako zewnętrzny element, a twój komentarz mówi root jako zewnętrzny element. Pewnie chcesz coś takiego:

<xsl:template match="/root">
  <xsl:for-each select="elem/file">
    <xsl:result-document method="xml" href="file_{@id}-output.xml">
      <root>
        <xsl:copy-of select="/root/@*" />
        <elem>
          <xsl:copy-of select="../@* | ." />
        </elem>
      </root>
    </xsl:result-document>
  </xsl:for-each>
</xsl:template> 

Możesz stać się bardziej fantazyjny, próbując użyć <xsl:copy> zamiast literalnych elementów wyniku dla roota i elem, ale nie wydaje się to warte wysiłku, chyba że będą się różnić.

 14
Author: LarsH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 01:33:07

W czystym XSLT 1.0 nie jest możliwe tworzenie więcej niż jednego pliku wyjściowego. Można by użyć <exslt:document> element rozszerzający do tego celu.

W XSLT 2.0 użyj <xsl:result-document> element.

 12
Author: Dimitre Novatchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-27 18:39:24

Jeśli chcesz użyć

<xsl:result-document method="xml" href="file_{@id}-output.xml">

Z połączenia Ant xslt, musisz użyć 2.0., wystarczy dodać w wywołaniu ANT:

<classpath location="/home/ap/saxon/saxon8.jar" />

And specifiy Version="2.0" I ciesz się dzieleniem plików.

 2
Author: millebii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-18 11:36:54