Autor Thema: xml Bearbeitung mit xslt (und eine nicht umschiffte Klippe mit grossen Files)  (Gelesen 1704 mal)

Marinero Atlántico

  • Gast
Ulrich Krause hatte letztens eine Frage gepostet, wo es darum ging - falls ich das richtig verstanden habe - aus Textnodes von bestimmten Element-Nodes einer großen xml Datei den Character '_' zu entfernen.
Er hat dafür dann irgendwann ein Tool genommen, was auch gut geklappt hat.
Ich hab das nun zum Anlaß genommen, meine xslt-Kenntnisse wieder ein bischen aufzufrischen und das ohne Tool zu machen.  

Es geht eigentlich ganz gut mit xslt, solange das File klein ist:

xml:
Code
<?xml version="1.0"?>


<?xml-stylesheet type="text/xsl" href="D:/wsad512/workspace/XsltTests/xslt/eknori1.xsl"?>
<document>
   <strip_here_not>Hello_World!</strip_here_not>
   <strip_here>Hello_World</strip_here>
</document>

bearbeitet von den xslts:
Code
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

</xsl:stylesheet>
wird importiert von:
Code
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:import href="copy.xsl" />

   <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

   <xsl:template match="//strip_here/text()">
         <xsl:value-of select="translate(., '_', ' ')" /> 
   </xsl:template>

</xsl:stylesheet>


(das importierte stylesheet kopiert einfach nur alle Elemente.
Und das andere, das dieses importiert liefert die entsprechende Funktionalität für die Business Anforderung. Ziemlich gute Idee wie ich finde (nicht von mir).  

ergibt:
Code
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="D:/wsad512/workspace/XsltTests/xslt/eknori1.xsl"?>

<document>
   <strip_here_not>Hello_World!</strip_here_not>
   <strip_here>Hello World</strip_here>
</document>
(in strip_here_not ist '_' nicht entfernt.
in strip_here schon).

Ziemlich wenig code, für das gewünschte Resultat also.

Wie erwartet gab es aber eine Out-Of-Memory Exception, als ich anfing ein 8 MB xml-File zu transformieren, das ich so erzeugt habe:
Code

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

import java.io.FileWriter;



/**
 * @author db2admin
 *
 * Folgendes auswählen, um die Schablone für den erstellten Typenkommentar zu ändern:
 * Fenster&gt;Benutzervorgaben&gt;Java&gt;Codegenerierung&gt;Code und Kommentare
 */
public class GenerateLargeXmlFile {

   public static void main(String[] args){
      try {
      
      BufferedWriter os = new BufferedWriter (new OutputStreamWriter(new FileOutputStream("xml\\eknoriLarge.xml"), "ISO-8859-1"));
      os.write("<?xml version='1.0'?>\n");
      os.write("<?xml-stylesheet type='text/xsl' href='D:/wsad512/workspace/XsltTests/xslt/eknori1.xsl'?>\n");
      os.write("<document>\n");
      for (int i=0; i < 100000; i++) {
         os.write("<strip_here_not>Hello_World!</strip_here_not>\n");
         os.write("<strip_here>Hello_World</strip_here>\n");
         System.out.println("i=" + i);
      }
      os.write("</document>\n");
      os.close();
      
      
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

Der Vorteil von einer solchen xslt Lösung wäre u.a., dass man es prima in Webservices oder sonstwie integrieren könnte.

Das Problem von der Bearbeitung von großen Files durch xslt ist ein allgemeines Problem, für das es wohl auch Lösungen gibt. Stand z.B. etwas in dem Blog von Rickard  Öberg. Ich versuche das nun für mich zu lösen.

Gruß Axel

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz