jürgi: Element duplizieren in XML Datei

hallo beisammen!

ich bin neu im thema xsl eingestiegen und bräuchte eure hilfe. ich habe eine xml instanz mit mehreren sections (waschmaschine), in denen ich ein bestehendes element (hersteller)jeweils duplizieren und als hersteller_2 in die jeweilige section zurückschreiben möchte. das sollte dann so aussehen:

ursprungs-xml:
...
<waschmaschine>
<hersteller>Miele</hersteller>
<hersteller_nr>366562m</hersteller_nr>
<manuf_dat>2008</manuf_dat>
<lager menge="Stueck">3</lager>
<typ>W 3741 WPS</typ>
<beschreibung>Waschvollautomat mit 1400 U/min. Patentierte Schontrommel mit 1-6 kg Beladung. Hochwertige Chromring-Tür. Attraktives Gerätedesign mit schräger Blende.</beschreibung>
<bestellnummer>mi0027131</bestellnummer>
<preis currency = "Euro">1019,00</preis>
<foto href = "file://Waschmaschinen/23299_g.jpg" />
</waschmaschine>

<waschmaschine>
...

ziel-xml:
<waschmaschine>
<hersteller>Miele</hersteller>

<hersteller_2>Miele</hersteller_2>

<hersteller_nr>366562m</hersteller_nr>
<manuf_dat>2008</manuf_dat>
<lager menge="Stueck">3</lager>
<typ>W 3741 WPS</typ>
<beschreibung>Waschvollautomat mit 1400 U/min. Patentierte Schontrommel mit 1-6 kg Beladung. Hochwertige Chromring-Tür. Attraktives Gerätedesign mit schräger Blende.</beschreibung>
<bestellnummer>mi0027131</bestellnummer>
<preis currency = "Euro">1019,00</preis>
<foto href = "file://Waschmaschinen/23299_g.jpg" />
</waschmaschine>

<waschmaschine>
...

______________________________________

mein xsl-skript sieht so aus:

<xsl:template match="root">
<xsl:element name="waschmaschine">

<xsl:element name="hersteller_2">
<xsl:value-of select="waschmaschine/hersteller"/></xsl:element>
<xsl:copy-of select="waschmaschine/hersteller"/>
<xsl:copy-of select="waschmaschine/hersteller_nr"/>
<xsl:copy-of select="waschmaschine/manuf_dat"/>
<xsl:copy-of select="waschmaschine/lager"/>
<xsl:copy-of select="waschmaschine/typ"/>
<xsl:copy-of select="waschmaschine/beschreibung"/>
<xsl:copy-of select="waschmaschine/bestellnummer"/>
<xsl:copy-of select="waschmaschine/preis"/>
<xsl:copy-of select="waschmaschine/foto"/>
</xsl:element>
</xsl:template>

__________________________________________

leider funktioniert das für nicht für alle sections bzw. funktioniert überhaupt nicht. bin froh um jede hilfestellung!

lieben dank und viele grüße
der jürgi

  1. Koenntest du mal mehr von deiner XML zeigen, wie die sections aussehen. Allgemein denke ich, dass es nicht gut ist, solche elementnamen "_2" zu erstellen. du solltest darueber nachdenken ob nicht ein ein attribute besser waere also

    <hersteller number="2">Miele</hersteller>

    Hinsichtlich dem einfuegen muesste man die xml sehen, damit man weiss, was du erreichen moechtest. Du kannst in aller regel uber xsl:template match="" gehen oder aber ueber xsl:for-each.

    Also zeig etwas mehr von der xml und es duerfte leicht sein hier zu helfen. Gruss, Holge r

    1. hallo holger!

      lieben dank für deine schnelle antwort! ich möchte dieses element hersteller als eigenständiges element duplizieren, da ich es in indesign nur als solches weiterverarbeiten kann.

      hier mal die ganze xml datei:

      <root>  
        
      <waschmaschine>  
      <hersteller>Miele</hersteller>  
      <hersteller_nr>366562m</hersteller_nr>  
      <manuf_dat>2008</manuf_dat>  
      <lager menge="Stueck">3</lager>  
      <typ>W 3741 WPS</typ>  
      <beschreibung>Waschvollautomat mit 1400 U/min. Patentierte Schontrommel mit 1-6 kg Beladung. Hochwertige Chromring-Tür. Attraktives Gerätedesign mit schräger Blende.</beschreibung>  
      <bestellnummer>mi0027131</bestellnummer>  
      <preis currency = "Euro">1019,00</preis>  
      <foto href = "file://Waschmaschinen/23299_g.jpg" />  
      </waschmaschine>  
        
      <waschmaschine>  
      <hersteller>Gorenje</hersteller>  
      <hersteller_nr>656562g</hersteller_nr>  
      <manuf_dat>2007</manuf_dat>  
      <lager menge="Stueck">12</lager>  
      <typ>WA 740</typ>  
      <beschreibung>Waschvollautomat mit 1400 U/min, 7 kg Fassungsvermögen. Mit Unwuchtkontrollsystem, Super silent - leiser Betrieb und Dusche-Waschsystem.</beschreibung>  
      <bestellnummer>gj0034567</bestellnummer>  
      <preis currency = "Euro">399,00</preis>  
      <foto href = "file://Waschmaschinen/25833_g.jpg" />  
      </waschmaschine>  
        
        
      <waschmaschine>  
      <hersteller>Siemens</hersteller>  
      <hersteller_nr>328762s</hersteller_nr>  
      <manuf_dat>2009</manuf_dat>  
      <lager menge="Stueck">11</lager>  
      <typ>WM 14E442</typ>  
      <beschreibung>Waschvollautomat mit 1400 U/min und 7 kg Fassungsvermögen sowie vollelektronischer Einknopf-Bedienung für alle Waschprogramme.</beschreibung>  
      <bestellnummer>sm0013485</bestellnummer>  
      <preis currency = "Euro">699,00</preis>  
      <foto href = "file://Waschmaschinen/25191_g.jpg" />  
      </waschmaschine>  
        
      <waschmaschine>  
      <hersteller>Gorenje</hersteller>  
      <hersteller_nr>652362g</hersteller_nr>  
      <manuf_dat>2008</manuf_dat>  
      <lager menge="Stueck">10</lager>  
      <typ>WS 40149</typ>  
      <beschreibung>Waschvollautomat mit 1400 U/min und 15 Programmen. Energieeffizienzklasse A.</beschreibung>  
      <bestellnummer>gj0036565</bestellnummer>  
      <preis currency = "Euro">349,00</preis>  
      <foto href = "file://Waschmaschinen/24770_g.jpg" />  
      </waschmaschine>  
        
      <waschmaschine>  
      <hersteller>Siemens</hersteller>  
      <hersteller_nr>114562s</hersteller_nr>  
      <manuf_dat>2008</manuf_dat>  
      <lager menge="Stueck">23</lager>  
      <typ>WM 14E422</typ>  
      <beschreibung>Waschvollautomat mit 1400 U/min und 7 kg Fassungsvermögen. Zeitoptimierte Waschprogramme und vollelektronische Einknopf-Bedienung für alle Waschprogramme.</beschreibung>  
      <bestellnummer>sm0017491</bestellnummer>  
      <preis currency = "Euro">599,00</preis>  
      <foto href = "file://Waschmaschinen/25878_g.jpg" />  
      </waschmaschine>  
        
      <waschmaschine>  
      <hersteller>Miele</hersteller>  
      <hersteller_nr>143562m</hersteller_nr>  
      <manuf_dat>2007</manuf_dat>  
      <lager menge="Stueck">3</lager>  
      <typ>W 1614</typ>  
      <beschreibung>Waschautomat mit 1400 U/min. Feinlochtrommel mit 1-6 kg Beladung. Mengenautomatik zur automatischen Energie- und Wassereinsparung. Elektronische Schaumregulierung und Update-Optische Schnittstelle.</beschreibung>  
      <bestellnummer>mi0056423</bestellnummer>  
      <preis currency = "Euro">819,00</preis>  
      <foto href = "file://Waschmaschinen/24463_g.jpg" />  
      </waschmaschine>  
        
      <waschmaschine>  
      <hersteller>Bauknecht</hersteller>  
      <hersteller_nr>145562b</hersteller_nr>  
      <manuf_dat>2008</manuf_dat>  
      <lager menge="Stueck">8</lager>  
      <typ>WAT SENSITIVE 32 DI</typ>  
      <beschreibung>Waschvollautomat mit 1200 U/min. Nur 40 cm breit. Grundprogramme für Koch/Buntwäsche, Pflegeleichtes, Feinwäsche und Wolle.</beschreibung>  
      <bestellnummer>ba0027434</bestellnummer>  
      <preis currency = "Euro">529,00</preis>  
      <foto href = "file://Waschmaschinen/25725_g.jpg" />  
      </waschmaschine>  
        
      <waschmaschine>  
      <hersteller>Bosch</hersteller>  
      <hersteller_nr>324654bs</hersteller_nr>  
      <manuf_dat>2008</manuf_dat>  
      <lager menge="Stueck">14</lager>  
      <typ>WAE 2834 A</typ>  
      <beschreibung>Energiesparsamer Waschvollautomat mit 1400 U/min und 6 kg Fassungsvermögen</beschreibung>  
      <bestellnummer>bo0023314</bestellnummer>  
      <preis currency = "Euro">899,00</preis>  
      <foto href = "file://Waschmaschinen/24052_g.jpg" />  
      </waschmaschine>  
        
      <waschmaschine>  
      <hersteller>Gorenje</hersteller>  
      <hersteller_nr>324562g</hersteller_nr>  
      <manuf_dat>2009</manuf_dat>  
      <lager menge="Stueck">20</lager>  
      <typ>WS 345</typ>  
      <beschreibung>Dieser Waschvollautomat aus der CLASSIC-Linie ist mit einer Tiefe von nur 44 cm sehr platzsparend. Trotzdem passen 4,5 kg Wäsche pro Waschgang in die Edelstahl-Trommel. Max. 1300 U/min.</beschreibung>  
      <bestellnummer>gj0035785</bestellnummer>  
      <preis currency = "Euro">279,00</preis>  
      <foto href = "file://Waschmaschinen/25675_g.jpg" />  
      </waschmaschine>  
        
      <waschmaschine>  
      <hersteller>Bauknecht</hersteller>  
      <hersteller_nr>377562b</hersteller_nr>  
      <manuf_dat>2007</manuf_dat>  
      <lager menge="Stueck">12</lager>  
      <typ>WA CARE 32 Di</typ>  
      <beschreibung>Dieser Waschvollautomat ist dank seiner Energieeffizienzklasse A* um ca. 10% sparsamer als vergleichbare Waschvollautomaten mit einer herkömmlichen Energieeffizienzklasse A.</beschreibung>  
      <bestellnummer>ba0024434</bestellnummer>  
      <preis currency = "Euro">399,00</preis>  
      <foto href = "file://Waschmaschinen/25743_g.jpg" />  
      </waschmaschine>  
        
        
      <waschmaschine>  
      <hersteller>Bosch</hersteller>  
      <hersteller_nr>332462bs</hersteller_nr>  
      <manuf_dat>2007</manuf_dat>  
      <lager menge="Stueck">1</lager>  
      <typ>WAS 28775 Logixx 8 Edition 75</typ>  
      <beschreibung>Waschvollautomat mit ca. 20 % weniger Energieverbrauch als vergleichbare Geräte mit einer Energieeffizienzklasse A. Er bietet zusätzlich verschiedene Sondefunktionen wie etwa eine Beladungserkennung mit integrierter Dosierungsempfehlung und ein in "Leicht-Bedien-System".</beschreibung>  
      <bestellnummer>bo0087254</bestellnummer>  
      <preis currency = "Euro">999,00</preis>  
      <foto href = "file://Waschmaschinen/25210_g.jpg" />  
      </waschmaschine>  
        
      <waschmaschine>  
      <hersteller>AEG</hersteller>  
      <hersteller_nr>654362a</hersteller_nr>  
      <manuf_dat>2009</manuf_dat>  
      <lager menge="Stueck">17</lager>  
      <typ>LAVAMAT 6261</typ>  
      <beschreibung>Waschvollautomat mit 1200 U/min, Waschwirkungsklasse A, 6 kg Fassungsvermögen.Vollelektronische Ein-Knopf-Programmsteuerung für einfachste Bedienung.</beschreibung>  
      <bestellnummer>ae0023154</bestellnummer>  
      <preis currency = "Euro">479,00</preis>  
      <foto href = "file://Waschmaschinen/24469_g.jpg" />  
      </waschmaschine>  
        
      </root>
      

      Koenntest du mal mehr von deiner XML zeigen, wie die sections aussehen. Allgemein denke ich, dass es nicht gut ist, solche elementnamen "_2" zu erstellen. du solltest darueber nachdenken ob nicht ein ein attribute besser waere also

      <hersteller number="2">Miele</hersteller>

      Hinsichtlich dem einfuegen muesste man die xml sehen, damit man weiss, was du erreichen moechtest. Du kannst in aller regel uber xsl:template match="" gehen oder aber ueber xsl:for-each.

      Also zeig etwas mehr von der xml und es duerfte leicht sein hier zu helfen. Gruss, Holge r

  2. Hallo Jürgi,

    ich bin neu im thema xsl eingestiegen und bräuchte eure hilfe. ich habe eine xml instanz mit mehreren sections (waschmaschine), in denen ich ein bestehendes element (hersteller)jeweils duplizieren und als hersteller_2 in die jeweilige section zurückschreiben möchte.

    Probiere es so:

    <?xml version="1.0" encoding="UTF-8"?>  
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
      
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>  
      
    <xsl:template match="@* | node()">  
      <xsl:copy>  
        <xsl:apply-templates select="@* | node()"/>  
      </xsl:copy>  
    </xsl:template>  
      
    <xsl:template match="hersteller">  
      <xsl:copy-of select="."/>  
      <hersteller_2><xsl:value-of select="."/></hersteller_2>  
    </xsl:template>  
      
    </xsl:stylesheet>
    

    Grüße,
    Thomas

    1. hallo thomas!

      das hat super geklappt - vielen dank für deine hilfe! :-)

      lg
      der jürgi

      Hallo Jürgi,

      ich bin neu im thema xsl eingestiegen und bräuchte eure hilfe. ich habe eine xml instanz mit mehreren sections (waschmaschine), in denen ich ein bestehendes element (hersteller)jeweils duplizieren und als hersteller_2 in die jeweilige section zurückschreiben möchte.

      Probiere es so:

      <?xml version="1.0" encoding="UTF-8"?>

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

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

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

      <xsl:template match="hersteller">
        <xsl:copy-of select="."/>
        <hersteller_2><xsl:value-of select="."/></hersteller_2>
      </xsl:template>

      </xsl:stylesheet>

      
      >   
      > Grüße,  
      > Thomas
      
  3. jetzt hab ich nochmal ne frage :o)

    ich möchte die xml datei, nachdem die duplizierten elemente (hersteller_2) angelegt worden sind, noch sortieren lassen (nach hersteller). sobald ich das mache, sind die vorher duplizierten elemente weg?!

    hier mal mein komplettes stylesheet:

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

    <!-- Duplizieren-->

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

    <xsl:template match="hersteller">
      <xsl:copy-of select="."/>
      <hersteller_2><xsl:value-of select="."/></hersteller_2>
    </xsl:template>

    <!--Sortieren-->
    <xsl:template match="root">
      <root>
        <xsl:apply-templates select="waschmaschine">
          <xsl:sort select="hersteller" data-type="text" order="ascending"/>
        </xsl:apply-templates>
      </root>
    </xsl:template>

    <xsl:template match="waschmaschine">
      <xsl:copy-of select="."/>
    </xsl:template>

    </xsl:stylesheet>

    ____________________________________________________

    wenn ich das duplizieren bzw. sortieren jeweils auskommentiere, funktioniert's?! verrückte welt! :-)

    hallo beisammen!

    ich bin neu im thema xsl eingestiegen und bräuchte eure hilfe. ich habe eine xml instanz mit mehreren sections (waschmaschine), in denen ich ein bestehendes element (hersteller)jeweils duplizieren und als hersteller_2 in die jeweilige section zurückschreiben möchte. das sollte dann so aussehen:

    ursprungs-xml:
    ...
    <waschmaschine>
    <hersteller>Miele</hersteller>
    <hersteller_nr>366562m</hersteller_nr>
    <manuf_dat>2008</manuf_dat>
    <lager menge="Stueck">3</lager>
    <typ>W 3741 WPS</typ>
    <beschreibung>Waschvollautomat mit 1400 U/min. Patentierte Schontrommel mit 1-6 kg Beladung. Hochwertige Chromring-Tür. Attraktives Gerätedesign mit schräger Blende.</beschreibung>
    <bestellnummer>mi0027131</bestellnummer>
    <preis currency = "Euro">1019,00</preis>
    <foto href = "file://Waschmaschinen/23299_g.jpg" />
    </waschmaschine>

    <waschmaschine>
    ...

    ziel-xml:
    <waschmaschine>
    <hersteller>Miele</hersteller>

    <hersteller_2>Miele</hersteller_2>

    <hersteller_nr>366562m</hersteller_nr>
    <manuf_dat>2008</manuf_dat>
    <lager menge="Stueck">3</lager>
    <typ>W 3741 WPS</typ>
    <beschreibung>Waschvollautomat mit 1400 U/min. Patentierte Schontrommel mit 1-6 kg Beladung. Hochwertige Chromring-Tür. Attraktives Gerätedesign mit schräger Blende.</beschreibung>
    <bestellnummer>mi0027131</bestellnummer>
    <preis currency = "Euro">1019,00</preis>
    <foto href = "file://Waschmaschinen/23299_g.jpg" />
    </waschmaschine>

    <waschmaschine>
    ...

    ______________________________________

    mein xsl-skript sieht so aus:

    <xsl:template match="root">
    <xsl:element name="waschmaschine">

    <xsl:element name="hersteller_2">
    <xsl:value-of select="waschmaschine/hersteller"/></xsl:element>
    <xsl:copy-of select="waschmaschine/hersteller"/>
    <xsl:copy-of select="waschmaschine/hersteller_nr"/>
    <xsl:copy-of select="waschmaschine/manuf_dat"/>
    <xsl:copy-of select="waschmaschine/lager"/>
    <xsl:copy-of select="waschmaschine/typ"/>
    <xsl:copy-of select="waschmaschine/beschreibung"/>
    <xsl:copy-of select="waschmaschine/bestellnummer"/>
    <xsl:copy-of select="waschmaschine/preis"/>
    <xsl:copy-of select="waschmaschine/foto"/>
    </xsl:element>
    </xsl:template>

    __________________________________________

    leider funktioniert das für nicht für alle sections bzw. funktioniert überhaupt nicht. bin froh um jede hilfestellung!

    lieben dank und viele grüße
    der jürgi

    1. Hallo Jürgi,

      ich möchte die xml datei, nachdem die duplizierten elemente (hersteller_2) angelegt worden sind, noch sortieren lassen (nach hersteller). sobald ich das mache, sind die vorher duplizierten elemente weg?!

      Ergänze noch ein Template für die Sortierung:

      <?xml version="1.0" encoding="UTF-8"?>  
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
        
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>  
        
      <xsl:template match="@* | node()">  
        <xsl:copy>  
          <xsl:apply-templates select="@* | node()"/>  
        </xsl:copy>  
      </xsl:template>  
        
      <xsl:template match="hersteller">  
        <xsl:copy-of select="."/>  
        <hersteller_2><xsl:value-of select="."/></hersteller_2>  
      </xsl:template>  
        
      <xsl:template match="root">  
        <xsl:apply-templates>  
          <xsl:sort select="hersteller" data-type="text" order="ascending"/>  
        </xsl:apply-templates>  
      </xsl:template>  
        
      </xsl:stylesheet>
      

      Grüße,
      Thomas

      1. Nachtrag:

        Füge noch <root>...</root> ein:

        <xsl:template match="root">  
          <root>  
            <xsl:apply-templates>  
              <xsl:sort select="hersteller" data-type="text" order="ascending"/>  
            </xsl:apply-templates>  
          </root>  
        </xsl:template>
        

        Grüße,
        Thomas

        1. :-)) genau, da war noch was! jetzt klappt's!

          vielen herzlichen dank und hab nen schönen abend
          der jürgi

          Nachtrag:

          Füge noch <root>...</root> ein:

          <xsl:template match="root">

          <root>
              xsl:apply-templates
                <xsl:sort select="hersteller" data-type="text" order="ascending"/>
              </xsl:apply-templates>
            </root>
          </xsl:template>

          
          >   
          > > Grüße,  
          > > Thomas
          
      2. hi thomas!

        wenn ich das template so ergänze, dann sagt mir xmlspy, dass das zeichen w (das w von der zweiten "waschmaschine-section) grammatikalisch nicht erwartet wird. liegt das jetzt daran, dass ich nicht mehr vom root element ausgehe?

        grüßle
        der jürgen

        Hallo Jürgi,

        ich möchte die xml datei, nachdem die duplizierten elemente (hersteller_2) angelegt worden sind, noch sortieren lassen (nach hersteller). sobald ich das mache, sind die vorher duplizierten elemente weg?!

        Ergänze noch ein Template für die Sortierung:

        <?xml version="1.0" encoding="UTF-8"?>

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

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

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

        <xsl:template match="hersteller">
          <xsl:copy-of select="."/>
          <hersteller_2><xsl:value-of select="."/></hersteller_2>
        </xsl:template>

        <xsl:template match="root">
          xsl:apply-templates
            <xsl:sort select="hersteller" data-type="text" order="ascending"/>
          </xsl:apply-templates>
        </xsl:template>

        </xsl:stylesheet>

        
        >   
        > Grüße,  
        > Thomas