Element duplizieren in XML Datei
jürgi
- xsl
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
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
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
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
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
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
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
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
:-)) 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
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