Elemente in bestimmte Knoten einfügen
Andreas
- xsl
Hallo,
Hab folgende Frage :
wie kann ich XML Elementknoten und zugehörigen Textknoten in eine bestimmte Stelle einfügen ?
Ich will das folgende XML Dokument kopieren und ergänzen, so dass alle Mitarbeiter, die jünger als 25 sind, den Knoten <Status>Ledig </Ledig> im <nachname> Konten enthalten.
**********
Also so :
...
<nachname>Meier
<status>Ledig</status>
</nachname>
...
***********
Hier das XML Dokument :
<?xml version="1.0" encoding="UTF-8"?>
<mb-datenbank>
<abteilung>
<name>
IT-Abteilung
</name>
<angehoerige>
<mitarbeiter alter="23" id="2">
<nachname>Meier</nachname>
<telefon>3421</telefon>
</mitarbeiter>
<mitarbeiter alter="26" id="7">
<nachname>Huber
</nachname>
<telefon>5564</telefon>
</mitarbeiter>
<mitarbeiter alter="25" id="4">
<nachname>Hinkelstein</nachname>
<telefon>3456</telefon>
</mitarbeiter>
</angehoerige>
</abteilung>
</mb-datenbank>
Das fehlerhaftes Stylesheet :
<?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"/>
<xsl:template match="@*|node()">
xsl:copy
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="mitarbeiter">
xsl:copy
<xsl:apply-templates select="@*|node()"/>
<xsl:if test="@alter<25">
<xsl:call-template name="ruf"/>
</xsl:if>
</xsl:copy>
</xsl:template>
<xsl:template name="ruf" match="nachname">
<xsl:element name="Status">
Ledig
</xsl:element>
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
</xsl:stylesheet>
Hallo,
Ich will das folgende XML Dokument kopieren und ergänzen, so dass alle Mitarbeiter, die jünger als 25 sind, den Knoten <Status>Ledig </Ledig> im <nachname> Konten enthalten.
Nicht besonders praxisnah ;-).
Also so :
...
<nachname>Meier
<status>Ledig</status>
</nachname>
...
Soll das wirklich mixed content werden?
Dann 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"/>
<xsl:template match="*|@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="nachname">
<xsl:choose>
<xsl:when test="parent::node()[number(@alter) < 25]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:element name="Status">Ledig</xsl:element>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Alternativ zur Ausgabe einer besseren Struktur in Form von
<mitarbeiter ...>
<nachname>Meier</nachname>
<status>Ledig</status>
...
</mitarbeiter>
im ersten xsl:when-Block schreiben:
<xsl:when test="parent::node()[number(@alter) < 25]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
<xsl:element name="Status">Ledig</xsl:element>
</xsl:when>
MfG, Thomas
Hi Thomas !!!
You are my man !!!!!!!!!!!!!!!!!!!!!
Du hast mir alle meine Fragen ausführlich und kompetent beantwortet !
Sehr herzlichen Dank !!!!!
Klar; meine Beispiele sind nicht gerade praxisrelevant ;-))
Ich versuche mehr oder weniger die Grenzen von XSL auszumachen.
Ich versuch mich gerade an regulären Ausdrücken (viele ähnliche Element/Textknoten zu finden bzw. zu ersetzen) mit XSL.
Wenn ichs wieder mal selbst nicht schaffe, weiss ich ja; was ich zu tun habe ;-)))