title: XSLT 1.0 check if element exists and append new child
body: <p>
  I have the following source-xml-file and would like to transform it with xsl into another xml-file.
  How can i check if an Element exists and depending on this result create a new one or append a child to the existing element?</p>
  
  <pre><code>&lt;Vortriebsorte&gt;
      &lt;Vortriebsort&gt;
          &lt;Name&gt;Südröhre&lt;/Name&gt;
          &lt;Bauphase&gt;Kalotte&lt;/Bauphase&gt;  
          &lt;Vortrieb&gt;Südröhre&lt;/Vortrieb&gt;     
      &lt;/Vortriebsort&gt;
      &lt;Vortriebsort&gt;
          &lt;Name&gt;Nordröhre&lt;/Name&gt;
          &lt;Bauphase&gt;Strosse&lt;/Bauphase&gt;     
          &lt;Vortrieb&gt;Nordröhre&lt;/Vortrieb&gt;
      &lt;/Vortriebsort&gt;
      &lt;Vortriebsort&gt;
          &lt;Name&gt;Südröhre&lt;/Name&gt;
          &lt;Bauphase&gt;Strosse / Sohle&lt;/Bauphase&gt;
          &lt;Vortrieb&gt;Südröhre&lt;/Vortrieb&gt;
      &lt;/Vortriebsort&gt;
  &lt;/Vortriebsorte&gt;
  </code></pre>
  
  <p>the result-xml-file should look like the following snippet:</p>
  
  <pre><code>&lt;data&gt;
  &lt;group name="Abschlagsdaten"&gt;
      &lt;group name="Vortrieb: Südröhre"&gt;
          &lt;group name="Bauphase: Kalotte"&gt;
            &lt;!--- some more stuff --&gt;
          &lt;/group&gt;          
          &lt;group name="Bauphase: Strosse / Sohle"&gt;
            &lt;!--- some more stuff --&gt;
          &lt;/group&gt;
      &lt;/group&gt;
      &lt;group name="Vortrieb: Nordröhre"&gt;                
          &lt;group name="Bauphase: Strosse / Sohle"&gt;
            &lt;!--- some more stuff --&gt;
          &lt;/group&gt;
      &lt;/group&gt;
  &lt;/group&gt;
  &lt;/data&gt;
  </code></pre>
  
  <p>the element "Bauphase" should be grouped by the element "Vortrieb" in the result-file.
  i was able to produce a valid output without grouping by "Vortrieb".</p>
  
  <p>as i'm new in xsl-tranformation i would appreciate if someone can give me a hint if this is possible and if so how?</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
  &lt;!-- Edited by XMLSpyÂ® --&gt;
  &lt;xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;
  &lt;xsl:strip-space elements="*" /&gt;
  &lt;xsl:output method="xml" indent="yes" /&gt;
  
  &lt;xsl:template match="@*|node()"&gt;            
      &lt;xsl:apply-templates select="@*|node()"/&gt;           
  &lt;/xsl:template&gt;
  
  &lt;xsl:template match="Vortriebsorte"&gt;    
      &lt;data&gt;
          &lt;xsl:for-each select="Vortriebsort"&gt;
          &lt;!-- if contains element append new element &lt;group name="Bauphase: ..."&gt; to the existing element --&gt;   
          &lt;xsl:if test="(contains(@name, \"Vortrieb: \"&lt;xsl:value-of select=\"Vortrieb\" /&gt;))"&gt;
              &lt;group&gt;
                  &lt;xsl:attribute name="name"&gt;Abschlag: &lt;xsl:value-of select="Bauphase" /&gt; &lt;/xsl:attribute&gt;
                  &lt;xsl:apply-templates select="Tunnelbandgruppen/Tunnelbandgruppe"/&gt;  
              &lt;/group&gt;
              &lt;/xsl:if&gt;
          &lt;!-- if NOT contains element add &lt;group name="Vortrieb: ..."&gt; and apply templates for child-nodes --&gt;   
          &lt;xsl:if test="not(contains(@name, \"Vortrieb: \"&lt;xsl:value-of select=\"Vortrieb\" /&gt;))"&gt;
              &lt;group&gt;
                  &lt;xsl:attribute name="name"&gt;Vortrieb: &lt;xsl:value-of select="Vortrieb" /&gt; &lt;/xsl:attribute&gt;    
                  &lt;group&gt;
                      &lt;xsl:attribute name="name"&gt;Abschlag: &lt;xsl:value-of select="Bauphase" /&gt; &lt;/xsl:attribute&gt;
                      &lt;xsl:apply-templates select="Tunnelbandgruppen/Tunnelbandgruppe"/&gt;  
                  &lt;/group&gt;
              &lt;/group&gt;                
              &lt;/xsl:if&gt;--&gt;
          &lt;/xsl:for-each&gt;
          &lt;/data&gt;
      &lt;/tunneltracer-exchange-file&gt;
  &lt;/xsl:template&gt;
  
  &lt;/xsl:stylesheet&gt;
  </code></pre>
  
  <p>kind regards,
  Markus</p>