You are not logged in.

  • Login

1

Tuesday, January 12th 2010, 2:16pm

Struktur einer XML-Datei mithilfe von XSL verändern

Hallo,
ich habe einen Datensatz bekommen, den ich gerne auswerten möchte. Jedoch ist die Datenstruktur dieser XML-Dateien nicht so, wie ich es mir vorstelle.
Das Problem ist, dass die Ausgangsdateien eine "Ebene" zuviel haben. Die Felder, welche die Feldbeschreibungen enthalten sollen entfernt werden.

XML Code

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?xml version="1.0" encoding="UTF-8"?>
<!--  Filename="TEST.XML"   -->
<Export Count="1" Date="2009-05-14T18:00:00" Language="DE" Range="DE">
<DataRecord>
 <Feldbeschreibung1>
  <Feld1>DATA</Feld1> 
  <Feld2>DATA</Feld2> 
  </Feldbeschreibung1>
<Feldbeschreibung2>
  <Feld3>DATA</Feld3> 
  <Feld4>DATA</Feld4> 
  </Feldbeschreibung2>
<Feldbeschreibung3>
  <Feld5>DATA</Feld5> 
  <Feld6>DATA</Feld6> 
</Feldbeschreibung3>
<Feldbeschreibung4>
  <Feld7>DATA</Feld7> 
  <Feld8>DATA</Feld8> 
</Feldbeschreibung4>
<Feldbeschreibung5>
  <Feld9>DATA</Feld9> 
  <Feld10>DATA</Feld10> 
  <Feld11>DATA</Feld11> 
  <Feld12>DATA</Feld12> 
  <Feld13>DATA</Feld13> 
  <Feld14>DATA</Feld14> 
  <Feld15>DATA</Feld15> 
</Feldbeschreibung5>
<Feldbeschreibung6>
  <Feld16>DATA</Feld16> 
  <Feld17>DATA</Feld17> 
</Feldbeschreibung6>
<Feldbeschreibung7>
  <Feld18>DATA</Feld18> 
</Feldbeschreibung7>
 <Feldbeschreibung8>
  <Feld19>DATA</Feld19> 
  <Feld20>DATA</Feld20> 
  <Feld21>DATA</Feld21> 
  <Feld22>DATA</Feld22> 
 </Feldbeschreibung8>
 <Feldbeschreibung9>
  <Feld23>DATA</Feld23> 
  </Feldbeschreibung9>
  </DataRecord>     
</Export>

Dies ist ein Beispiel für die Struktur der Ausgangsdatei, wobei der Usprungsdatensatz eine sehr viel größere Menge solcher <DataRecords> umfasst.
Ich kann mithilfe der folgenden XSL-Datei und Saxonica die Struktur ändern, jedoch gelingt es mir nur, wenn es lediglich einen <DataRecord> in der XML-Datei gibt.

XML Code

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:template match="/">
<xsl:for-each select="//DataRecord">
     <DataRecord>
     <xsl:for-each select="//Feld1">
          <Feld1>
               <xsl:value-of select="."></xsl:value-of>  
          </Feld1>
     </xsl:for-each>    
     <xsl:for-each select="//Feld2">
          <Feld2>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld2>
     </xsl:for-each>
     <xsl:for-each select="//Feld3">
          <Feld3>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld3>
     </xsl:for-each>
     <xsl:for-each select="//Feld4">
          <Feld4>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld4>
     </xsl:for-each>
   <xsl:for-each select="//Feld5">
          <Feld5>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld5>
     </xsl:for-each>
    <xsl:for-each select="//Feld6">
          <Feld6>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld6>
     </xsl:for-each>
  <xsl:for-each select="//Feld7">
          <Feld7>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld7>
     </xsl:for-each>
 <xsl:for-each select="//Feld8">
          <Feld8>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld8>
     </xsl:for-each>
     <xsl:for-each select="//Feld9">
          <Feld9>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld9>
     </xsl:for-each>
     <xsl:for-each select="//Feld10">
          <Feld10>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld10>
     </xsl:for-each>
     <xsl:for-each select="//Feld11">
          <Feld11>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld11>
     </xsl:for-each>
     <xsl:for-each select="//Feld12">
          <Feld12>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld12>
     </xsl:for-each>
     <xsl:for-each select="//Feld13">
          <Feld13>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld13>
     </xsl:for-each>
     <xsl:for-each select="//Feld14">
          <Feld14>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld14>
     </xsl:for-each>
      <xsl:for-each select="//Feld15">
          <Feld15>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld15>
     </xsl:for-each>
      <xsl:for-each select="//Feld16">
          <Feld16>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld16>
     </xsl:for-each>
     <xsl:for-each select="//Feld17">
          <Feld17>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld17>
     </xsl:for-each>
     <xsl:for-each select="//Feld18">
          <Feld18>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld18>
     </xsl:for-each>
     <xsl:for-each select="//Feld19">
          <Feld19>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld19>
     </xsl:for-each>
      <xsl:for-each select="//Feld20">
          <Feld20>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld20>
     </xsl:for-each>
          <xsl:for-each select="//Feld21">
          <Feld21>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld21>
     </xsl:for-each>           
     <xsl:for-each select="//Feld22">
          <Feld22>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld22>
     </xsl:for-each>
         <xsl:for-each select="//Feld23">
          <Feld23>
               <xsl:value-of select="."></xsl:value-of>             
         </Feld23>
     </xsl:for-each>
      </DataRecord>
 </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Im Beispielfall gelingt es mir mit dieser XSL-Datei aus der Ausgangs XML-Datei die folgende Datei zu generieren, welche die gewünschte Struktur besitzt.

XML Code

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
<?xml version="1.0" encoding="UTF-8"?>
<DataRecord>
<Feld1>DATA</Feld1>
<Feld2>DATA</Feld2>
<Feld3>DATA</Feld3>
<Feld4>DATA</Feld4>
<Feld5>DATA</Feld5>
<Feld6>DATA</Feld6>
<Feld7>DATA</Feld7>
<Feld8>DATA</Feld8>
<Feld9>DATA</Feld9>
<Feld10>DATA</Feld10>
<Feld11>DATA</Feld11>
<Feld12>DATA</Feld12>
<Feld13>DATA</Feld13>
<Feld14>DATA</Feld14>
<Feld15>DATA</Feld15>
<Feld16>DATA</Feld16>
<Feld16>DATA</Feld16>
<Feld17>DATA</Feld17>
<Feld18>DATA</Feld18>
<Feld19>DATA</Feld19>
<Feld20>DATA</Feld20>
<Feld21>DATA</Feld21
><Feld22>DATA</Feld22>
<Feld23>DATA</Feld23>
</DataRecord>

Ich hoffe es wird einigermaßen klar, welches Ziel ich mit der Vorgehensweise verfolge.
Ich bin bei weitem kein Programmierer und habe mich für dieses Projekt zum ersten Mal mit XSL/XML wirklich auseinandergesetzt.
Die Frage ist jetzt eigentlich gibt es eventuell eine einfachere Syntax, für die XSL-Datei, und wie bekomme ich es hin, dass es für eine beliebige Anzahl von <DataRecords> funktioniert?
Vielen Dank für Antworten!

This post has been edited 1 times, last edit by "hannes|" (Jan 12th 2010, 2:46pm)


2

Tuesday, January 12th 2010, 9:48pm

schlechte xml datei

so wird xml nicht benutzt
eine Nummierung ist Unsinn da sie erzeugt werden könnte

aber ist möglich sie mit xsl aus zuwerten

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes" method="xml"/>
    <xsl:template match="/">
        <xsl:apply-templates select="Export"/>
    </xsl:template>
    <xsl:template match="Export">
        <xsl:apply-templates select="DataRecord"/>
    </xsl:template>
<xsl:template match="DataRecord">
    <DataRecord>
    <xsl:for-each select=".//*/*">
       <xsl:element name="{local-name(.)}">
        <xsl:value-of select="."/>
       </xsl:element>
    </xsl:for-each>
    </DataRecord>
</xsl:template>
</xsl:stylesheet>


wenn zweiter DatenRecord geben ist die erzuegt Xml datei nicht valid
bei fragen icq 567877710
Helmut Hagemann

3

Wednesday, January 13th 2010, 8:52am

Das mit den Zahlen habe ich händisch gemacht, da ich die eigentlichen Daten nicht veröffentlichen wollte. Ein weiterer Fehler von mir war, dass ich vergessen habe, dass es in der Output-XML-Datei einen schließenden Tag gibt, der alle <DataRecords> einschließt. Diesen habe ich in der XSL-Datei von dir noch eingebaut und bekomme so eine valide XML-Datei. Es funktioniert auch mit sehr großen XML-Dateien, die mehr als einen Datensatz enthalten.

XML Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output indent="yes" method="xml"/>
    <xsl:template match="/">
        <xsl:apply-templates select="Export"/>
    </xsl:template>
    <xsl:template match="Export">
<Export>
        <xsl:apply-templates select="DataRecord"/>
</Export>
    </xsl:template>
<xsl:template match="DataRecord">
    <DataRecord>
    <xsl:for-each select=".//*/*">
       <xsl:element name="{local-name(.)}">
        <xsl:value-of select="."/>
       </xsl:element>
    </xsl:for-each>
    </DataRecord>
</xsl:template>
</xsl:stylesheet>

Vielen Dank für die Hilfe!

This post has been edited 1 times, last edit by "hannes|" (Jan 13th 2010, 1:59pm)


Social bookmarks