Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8622[/thread]

Perl.exe stirbt bei XSLT Transformation - warum?

Leser: 1


<< >> 5 Einträge, 1 Seite
rk-ger
 2007-01-05 16:44
#72906 #72906
User since
2006-08-07
45 Artikel
BenutzerIn
[default_avatar]
Ich habe ein XML File in diesem Format:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>
<XML>
<LINE>
<VAR NAME="1" MACROON="smallon" COL="5" LENGTH="11">23012349697</VAR>
<VAR NAME="2" COL="18" LENGTH="3">GB</VAR>
<VAR NAME="3" COL="25" LENGTH="6">1111</VAR>
<VAR NAME="4" COL="32" LENGTH="15">NC 16.0%</VAR>
<VAR NAME="5" COL="49" LENGTH="8" JUSTIFICATION="right">17.60</VAR>
<VAR NAME="6" COL="60" LENGTH="4" JUSTIFICATION="right">16.0</VAR>
<TEXT COL="64">%</TEXT>
<VAR NAME="7" COL="70" LENGTH="10" JUSTIFICATION="right">0.00</VAR>
<VAR NAME="8" COL="87" LENGTH="7" JUSTIFICATION="right">9.50</VAR>
<VAR NAME="9" COL="100" LENGTH="7" JUSTIFICATION="right">0.00</VAR>
<VAR NAME="0" MACROOFF="smalloff" COL="111" LENGTH="10" JUSTIFICATION="right">9.50</VAR>
</LINE>
<LINE></LINE>
<LINE>
<VAR NAME="1" MACROON="smallon" COL="5" LENGTH="11">23981239687</VAR>
<VAR NAME="2" COL="18" LENGTH="3">A</VAR>
<VAR NAME="3" COL="25" LENGTH="6">8410</VAR>
<VAR NAME="4" COL="32" LENGTH="15">NC 16.0%</VAR>
<VAR NAME="5" COL="49" LENGTH="8" JUSTIFICATION="right">19.15</VAR>
<VAR NAME="6" COL="60" LENGTH="4" JUSTIFICATION="right">16.0</VAR>
<TEXT COL="64">%</TEXT>
<VAR NAME="7" COL="70" LENGTH="10" JUSTIFICATION="right">0.00</VAR>
<VAR NAME="8" COL="87" LENGTH="7" JUSTIFICATION="right">9.20</VAR>
<VAR NAME="9" COL="100" LENGTH="7" JUSTIFICATION="right">0.00</VAR>
<VAR NAME="0" MACROOFF="smalloff" COL="111" LENGTH="10" JUSTIFICATION="right">9.20</VAR>
</LINE>
<LINE></LINE>
</XML>


und ein XSLT File um die XML Datei in eine CSV Datei zu wandeln:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:strip-space elements="*" />

<xsl:template match="/">
<xsl:apply-templates select="/XML/LINE"/>
</xsl:template>

<xsl:template match="/XML/LINE">
<xsl:variable name="anz_var" select="count(child::VAR)" />
<xsl:if test="$anz_var = 10">
<xsl:for-each select="VAR">
<xsl:if test="position() != last()"><xsl:value-of select="normalize-space(.)"/>;</xsl:if>
<xsl:if test="position() = last()"><xsl:value-of select="normalize-space(.)"/><xsl:text>&#x0A;</xsl:text></xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:template>
</xsl:stylesheet>


Herauskommen soll dieses CSV-File:

Code: (dl )
1
2
23012349697;GB;1111;NC 16.0%;17.60;16.0;0.00;9.50;0.00;9.50
23981239687;A;8410;NC 16.0%;19.15;16.0;0.00;9.20;0.00;9.20


Mit diesem Code funktioniert das auch:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my $xmlfile = "1.xml";
my $xslfile = "1.xsl";

use XML::LibXSLT;
use XML::LibXML;

print "start\n";
my $parser = XML::LibXML->new();
my $xslt = XML::LibXSLT->new();

my $source = $parser->parse_file($xmlfile);
my $style_doc = $parser->parse_file($xslfile);

my $stylesheet = $xslt->parse_stylesheet($style_doc);

my $results = $stylesheet->transform($source);

print $stylesheet->output_string($results);
print "\nstop\n";


Das waren Testdaten. Damit gibt es keine Probleme. Wenn ich jetzt aber das 'echte' XML File nehme, dann stirbt mir Perl (Windows) mit einem 'Ausnahmefehler'. Sowohl in der IDE (Eclipse) als auch auf der Kommandozeile (Windows 2000 pro). Das 'echte' XML File ist immer zwischen 30000 und 60000 Zeilen lang und erzeugt eine CSV Datei mit 2500 bis 5000 Zeilen. Kann das ein Speicherplatzproblem sein? Ich habe in dem Rechner nur 512 MB.
rk-ger
 2007-01-05 17:07
#72907 #72907
User since
2006-08-07
45 Artikel
BenutzerIn
[default_avatar]
Gefunden! Ich hätte noch länger suchen sollen.

Das 'echte' XML File hatte dieses Encoding:

Code: (dl )
<?xml version="1.0" encoding="iso8859-1"?>


unter Windows muss der Encoding-String aber so aussehen:

Code: (dl )
<?xml version="1.0" encoding="iso-8859-1"?>


Da muss man erst mal drauf kommen...

Anschlussfrage: Wie öffne ich die Datei schnell, ändere nur die Zeile 1 und schließe die Datei wieder ohne sie komplett einzulesen? Wenn ich die jedesmal komplett einlese, vergehen Stunden. Ich habe jeden Tag tausende dieser Dateien und kann sie nicht an der Quelle ändern.
renee
 2007-01-05 17:34
#72908 #72908
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
use Tie::File;

my $file = '/pfad/zu/datei';
tie my @array,'Tie::File',$file or die $!;
$array[0] = "neue erste Zeile\n";
untie @array;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sesth
 2007-01-08 00:02
#72909 #72909
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Das 'echte' XML hält sich aber nicht an die Standard-Empfehlungen :( : http://www.iana.org/assignments/character-sets
Gruß
Thomas
esskar
 2007-01-08 00:09
#72910 #72910
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
abstürzen ist aber nie eine gute lösung! ;)
<< >> 5 Einträge, 1 Seite



View all threads created 2007-01-05 16:44.