Andreas: Elemente in bestimmte Knoten einfügen

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&lt;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>

  1. 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) &lt; 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) &lt; 25]">  
          <xsl:copy>  
            <xsl:apply-templates select="@*|node()"/>  
          </xsl:copy>  
          <xsl:element name="Status">Ledig</xsl:element>  
        </xsl:when>
    

    MfG, Thomas

    1. 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 ;-)))