Bestehende xml Datei / Datenstruktur kopieren und um ein Attribut erweitern

MoeZarella

Grünschnabel
Hallo zusammen,

ich habe folgendes Problem:

Ausgangspunkt ist eine Datenstruktur wie diese
Code:
<tests>
  <test>
    <level>info</level>
  </test>
  <test>
    <level>info</level>
  </test>
</tests>

Diese wird mir fertig übergeben, ich kann sie also nicht ändern. In einem ersten Schritt schreibe ich diese per
Code:
<xsl:sequence...>
in eine Datei.

Der nächste Schritt ist diese Datei mit einem anderen Stylesheet wieder einzulesen und weiter zu verarbeiten (wie, ist für das Problem unerheblich). Allerdings benötige ich die Datei nun in folgender Form:

Code:
<tests>
<test>
  <level num="1">info</level>
</test>
<test>
  <level num="1">info</level>
</test>
</tests>

d.h. ich benötige ein zusätzliches Attribut. Wie kann ich das bewerkstelligen? Ich weiß, dass es
Code:
<xsl:attribute>
gibt, aber meine bisherigen Versuche scheiterten das in dieser Situation an zu wenden. Wäre es möglich mit einem einfachen Stylesheet, dass mir die Datei komplett kopiert zu arbeiten? Das müsste dann zwei Templates haben. Eines, das mir alle Knoten bis auf "level" kopiert und eines, das genau diesen Level-Knoten erst um ein Attribut erweitert und dann kopiert. Leider weiß ich aber nicht wie ich das realisieren kann.
Besser wäre natürlich, wenn ich kein zusätzliches Stylesheet brauchen würde, d.h. wenn ich diese Anpassung vornehmen könnte, bevor ich per "sequence" den Baum im ersten Schritt einfüge.

Wäre cool, wenn ihr euch meinem Problem annehmen könntet.

Gruß

Moe
 
Du brauchst eine sogenannte identity transformation, die ein matching template für level enthält, etwa so:
Code:
<xsl:stylesheet
	version="2.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:template match="level">
		<xsl:copy>
			<xsl:attribute name="num">1</xsl:attribute>
			<xsl:apply-templates select="@* | node()"/>
		</xsl:copy>
	</xsl:template>
	<!--  -->
</xsl:stylesheet>
Ob zwei Transformationen notwendig sind, kann ich Deinen Angaben nicht entnehmen. Da Du xsl:sequence select="…" benutzt, nehme ich an, dass Du aus einem größeren Eingabedokument einen Teilbaum entnimmst. Dann könntest Du schon im ersten Schritt an dieser Stelle xsl:apply-templates select="…" schreiben und die identity transformation nur auf den Teilbaum anwenden.
 

Neue Beiträge

Zurück