Rolf: for-each Schleife (erstes Element)

Hallo ich habe ein Problem mit XSLT.
Ich habe ein XML-Dokument das aus verschiedenen Schichten besteht.
Das einzige was bekannt ist, das im local-name() immer 'Schicht' vorkommt als so:

<Schicht1></Schicht1>
<Schicht2></Schicht2>
<Schicht3></Schicht3>
<Schicht4></Schicht4>

unter diesen Knoten befinden sich dann immer Informationen zu den Schichten, wobel diese nicht vorkommen müssen.

Ich navigiere nun mittels eines Dropdown-Button (Javascript) durch die Schichten indem ich immer die Positioinsnummer übergebe.

Im Xslt wird dann immer in einer for-each Schleife die Positionsnummer ausgewertet. Aufgabe ist nun als erstes anzuzeigen ob eine spezielle Information in der aktuellen Schicht, in der man sich befindet, ist.
Wenn nicht soll die Information aus der nächsten Schicht anzeigt werden, in der diese Information vorkommt.

Das erste ist kein Problem:
<xsl:for-each select="//child::*[contains(local-name(), 'Schicht')]">
<xsl:if test="position()  = $positionsnummer">

xsl:choose

<xsl:when test="boolean(information)">

<xsl:for-each select="//child::*[contains(local-name(), 'Schicht')]">

<xsl:if test="position()  = $positionsnummer">

<xsl:value-of select="information"></xsl:value-of>
</xsl:if>
</xsl:for-each>
</xsl:when>

ok jetzt wenn dien information nicht vorkommt in der aktuellen Schicht!

<xsl:when test="not (boolean(information))">

<xsl:for-each select="//child::*[contains(local-name(), 'Schicht')]">

<xsl:if test="position()  &gt; ($positionsnummer">

das geht auch bis hier, jetzt muss das erste element ausgegeben werden. jetzt werden aber leider alles elemente in allen drunterliegenden Schichten ausgegeben.
Mit Javascript kann ich das realisieren, ist aber nicht besonders elegant, da ich dann flags in javascript setzen kann aber dies geht nicht in xslt.

hat jemand eine idee?

danke

  1. Tach Rolf,

    das geht auch bis hier, jetzt muss das erste element ausgegeben werden. jetzt werden aber leider alles elemente in allen drunterliegenden Schichten ausgegeben.

    Suchst Du

    //child::*[contains(local-name(), 'Schicht')][1]

    ?

    Man liest sich,
    svg4you

    1. Ja das ist die erste Schicht!
      ich brauche aber die erste Schicht die ein spezielles Unterelement besitzt!

      danke

      1. Tach Rolf,

        Ja das ist die erste Schicht!
        ich brauche aber die erste Schicht die ein spezielles Unterelement besitzt!

        Das wird aber aus dem Codefragment nicht deutlich. Zeige mal mehr von der verwendeten Struktur. Vermutlich ist hier xsl:for-each auch nicht unbedingt die beste Wahl (ist übrigens nach wie vor keine Schleife, denn "da loopt nichts" [TM]), vielleicht bringt xsl:apply-templates mehr Komfort.

        Man liest sich,
        svg4you

        1. Also:

          <Schicht1>
           <Schicht2>
                         <Schichtnummer>123</Schichtnummer>

          <Schicht3>
                            <Schicht4>
                   <Schichtnummer>20</Schichtnummer>          <Schicht5>
              <Schichtnummer>2</Schichtnummer>
          </Schicht5>
          </Schicht4>
          </Schicht3>
          </Schicht2>
          </Schicht1>

          Also wenn ich in der ersten Schicht bin, will ich den Wert aus der zweiten haben.
          Wenn ich in der zweiten bin, den wert aus 2.
          Wenn ich in der 3 bin dann den wert aus 4 usw

          1. Tach Rolf,

            Also wenn ich in der ersten Schicht bin, will ich den Wert aus der zweiten haben.
            Wenn ich in der zweiten bin, den wert aus 2.
            Wenn ich in der 3 bin dann den wert aus 4 usw

            Sofern ich das Prinzip richtig verstanden habe, läuft es darauf hinaus:

              
            <xsl:for-each select="//child::*[contains(local-name(), 'Schicht')]">  
              <xsl:if test="child::*[1]/Schichtnummer">  
                <xsl:value-of select="child::*[1]/Schichtnummer/text()"/><br />  
              </xsl:if>  
            </xsl:for-each>
            

            Gibt 123 und 20 aus.

            Man liest sich,
            svg4you

            1. Hallo,

              Also es kam glaub ich nicht wirklich rüber was ich erreichen will:

              Ich möchte IMMER nur einen Wert haben und immer den ERSTEN der gefunden wurden. Ich zeig mal ein Javascript Beispiel.

              <xsl:for-each select="//child::*[contains(local-name(), 'Schicht')]">

              <xsl:if test="position()  &gt; $positionsnummer">

              <xsl:if test="Schichtnummer">

              erstes element('
              <xsl:value-of select="en:EB/en:Rechtsbehelf"></xsl:value-of>
              ');

              javascript:
              count=0;
              function erstes_element(wert){
              if (count=0)
              {
              document.write(wert);
              count++
              }

              vielleicht wird es jetzt klarer, also ich brauche immer das erste element was er findet aber ohne javascript!

              danke

              1. Tach Rolf,

                vielleicht wird es jetzt klarer, also ich brauche immer das erste element was er findet aber ohne javascript!

                Das wäre dann einfach wurzel//Schichtnummer[1].

                Man liest sich,
                svg4you

                1. Das wäre dann einfach wurzel//Schichtnummer[1].

                  nein leider ja nicht, da er immer alle Schichten durchgeht und sich die position() dynamisch ändert leider nicht.

                  <xsl:for-each select="//child::*[contains(local-name(), 'Schicht')]">
                  <xsl:if test="position()  &gt; $positionsnummer">

                  je nach dem in welcher Schicht eine Schichtnummer steht, kann die position mal 1 oder 2 oder 3... sein.

                  Wenn ich in der for-each nach der nummer suche also so:

                  <xsl:if test="Schichtnummer">
                  und dann die position ausgeben lasse:

                  <xsl:value-of select="position()"></xsl:value-of>

                  ist die positionsnummer immer anders der ich die for-each ja schon an gewisse bedingungen knüpfe!

                  ok aber danke

          2. Hello out there!

            <Schicht1>
            <Schicht2>
                           <Schichtnummer>123</Schichtnummer>

            <Schicht3>
                              <Schicht4>
                     <Schichtnummer>20</Schichtnummer>          <Schicht5>
                <Schichtnummer>2</Schichtnummer>
            </Schicht5>
            </Schicht4>
            </Schicht3>
            </Schicht2>
            </Schicht1>

            Wie bitte? Das ist was völlig anders als du im OP kucken lassen hast.

            Also wenn ich in der ersten Schicht bin, will ich den Wert aus der zweiten haben.
            Wenn ich in der zweiten bin, den wert aus 2.

            Nicht den aus der dritten?

            Wenn ich in der 3 bin dann den wert aus 4 usw

            Relative Pfadangaben mit Wildcards sollten dir helfen.

            See ya up the road,
            Gunnar

            --
            „Wer Gründe anhört, kommt in Gefahr nachzugeben.“ (Goethe)
          3. Hallo,

            Also:

            <Schicht1>
            <Schicht2>
                           <Schichtnummer>123</Schichtnummer>

            <Schicht3>
                              <Schicht4>
                     <Schichtnummer>20</Schichtnummer>          <Schicht5>
                <Schichtnummer>2</Schichtnummer>
            </Schicht5>
            </Schicht4>
            </Schicht3>
            </Schicht2>
            </Schicht1>

            Also wenn ich in der ersten Schicht bin, will ich den Wert aus der zweiten haben.
            Wenn ich in der zweiten bin, den wert aus 2.
            Wenn ich in der 3 bin dann den wert aus 4 usw

            Auch wenn ich alle Postings durchgelesen habe, ist auch mir nicht klar, was du eigentlich erreichen möchtest.

            Du sprichst von erster "Schicht, die gibts aber nicht. Du spricht vom "Wert", der ist aber noch nebulöser.
            Bitte versuche deine Frage konkret zu stellen in dem du:
             - einen Kodefragment postetest, das tatsächlich deine XML-Struktur wiederspiegelt
             - den XSL-Teil in dem du dein Ziel erreichen willst bzw. das was du davon hast
             - und letztlich, das was du erreichen möchtest: wenn du "erste Schicht" sagst, dann scheibe bitte z.B. Schicht1, wenn du "Wert" Sagst dann schreibe z.B: "Schichtnummer im Schicht2" etc.

            Grüße
            Thomas

            1. Hallo!

              Also die XML-Struktur haut so hin:

              <Schicht1>
              <Schicht2>
                             <Schichtnummer>123</Schichtnummer>

              »»

              <Schicht3>
                                <Schicht4>
                       <Schichtnummer>20</Schichtnummer>

              <Schicht5>

              <Schichtnummer>2</Schichtnummer>
              </Schicht5>
              </Schicht4>
              </Schicht3>
              </Schicht2>
              </Schicht1>

              Das heißt Schicht 1 hat keine Schichtnummer.
              Schicht2 hat eine Schichtnummer
              Schicht3 hat keine Schichtnummer
              Schicht4 hat eine Schichtnummer
              Schicht 5 hat auch eine Schichtnummer!

              Nun zum XSL:

              Über ein Dropdown-Menü kann die Schicht ausgewählt werden.
              Wenn in dieser Schicht eine Schichtnummer exitier soll sie ausgegeben werden. SIehe hier:

              <xsl:for-each select="//child::*[contains(local-name(), 'Schicht')]">
              <xsl:if test="position()  = $positionsnummer">

              xsl:choose

              <xsl:when test="boolean(Schichtnummer)">

              <xsl:for-each select="//child::*[contains(local-name(), 'Schicht')]">

              <xsl:if test="position()  = $positionsnummer">

              <xsl:value-of select="Schichtnummer"></xsl:value-of>
              </xsl:if>
              </xsl:for-each>
              </xsl:when>

              und nun zum fall wenn die Schichtnummer nicht in der aktuellen Schicht ist. Dann wird geprüft ob die Schichtnummer in den darunter liegenden Schichten existiert.

              <xsl:when test="not (boolean(Schichtnummer))">

              <xsl:for-each select="//child::*[contains(local-name(), 'Schicht')]">

              <xsl:if test="position()  &gt; ($positionsnummer">

              das geht auch alles, nun soll aber die erste Schichtnummer ausgegeben werde die gefunden wird, da ich nur die Schichtnummer haben will, die   in der am nächsten darunterliegenden Schicht haben will.
              Ich bekomme aber immer alle. Ich kann aber an der for-each nichts ändern, da dann das Prinzip mit meiner Positionsnummer nicht mehr geht!

              danke

              1. Hello out there!

                Also die XML-Struktur haut so hin:

                Kannst du die Struktur auch bitte strukturiert notieren? Also so:

                <Schicht1>  
                  <Schicht2>  
                    <Schichtnummer>123</Schichtnummer>  
                    <Schicht3>  
                      <Schicht4>  
                        <Schichtnummer>20</Schichtnummer>  
                        <Schicht5>  
                          <Schichtnummer>2</Schichtnummer>  
                        </Schicht5>  
                      </Schicht4>  
                    </Schicht3>  
                  </Schicht2>  
                </Schicht1>
                

                Über ein Dropdown-Menü kann die Schicht ausgewählt werden.

                Aha, schön zu wissen. Kommen noch irgendwelche relevanten Informationen hinterher?

                Würdest du dich bitte erstmal sammeln und dein Problem umfassend (das heißt nicht ausschweifend!) beschreiben?

                Hast du in diesem Thread schon verraten, wie du die vom Nutzer getätigte Auswahl an das XSLT übergibst?

                See ya up the road,
                Gunnar

                --
                „Wer Gründe anhört, kommt in Gefahr nachzugeben.“ (Goethe)
                1. <Schicht1>
                    <Schicht2>
                      <Schichtnummer>123</Schichtnummer>
                      <Schicht3>
                        <Schicht4>
                          <Schichtnummer>20</Schichtnummer>
                          <Schicht5>
                            <Schichtnummer>2</Schichtnummer>
                          </Schicht5>
                        </Schicht4>
                      </Schicht3>
                    </Schicht2>
                  </Schicht1>

                  Hallo!

                  Nee das war es an Informationen wichtig ist halt, das die for-each nicht verändert werden darf und ich trotzden "nur" die erste Schichtnummer die gefunden wird, ausgegeben wird.

                  Die Variable Positionsnummer die in der for-each abgefragt wird, dient der Navigation des Nutzers. Diese wird mittels eines dropdown-menüs an die XSLT-Datei übergeben, wie ich schon erwähnte.

                  Ich schreibe mal noch ein Bespiel.
                  Der Nutzers wähl über das Dropdown die Schicht3 aus. In dieser Schicht befindet sich keine Schichtnummer, also müssen die Schicht 4  und 5 untersucht werden. Dabei würden nach meinem Prinzip die Schichtnummer aus der Schicht 4 und 5 ausgegeben werden.
                  Ich bräuchte aber nur die Schichtnummer aus der Schicht 4.

                  danke

              2. Hallo,

                Also die XML-Struktur haut so hin:

                Na gut. Also dann eben so: <?xml version="1.0" encoding="ISO-8859-1"?> <test>  <Schicht1>   <Schicht2>    <Schichtnummer>123</Schichtnummer>    <Schicht3>     <Schicht4>      <Schichtnummer>20</Schichtnummer>      <Schicht5>       <Schichtnummer>2</Schichtnummer>      </Schicht5>     </Schicht4>    </Schicht3>   </Schicht2>  </Schicht1> </test>

                Nun zum XSL:

                Du hast wieder nur den mehr oder wenigen (un)sinnigen Kodeschnipsel gepostet, der schon vorher da war. Aber gucken wir mal....

                Über ein Dropdown-Menü kann die Schicht ausgewählt werden.

                1. wo steht dieses for-each denn!? Sprich: was ist das Element in dessen Templates es steht? (wobei das insofern irrelevant ist, da du immer vom "//" ausgehst)
                2. was ist $positionsnummer? Sprich woher bekommst das for-each sie denn und was steht drinn? 3)  Wenn es ein Dropdown-Menü sein soll, warum postest deinen Kode nicht so, dass man darin sehe kann was du machst? (glaube mir, keiner ist hier an den Buchstaben deines XML/XSLT interessiert, am allerwenigsten ich, aber wenn du nichts sagst ist es nunmal ein "im Glaskugel gucken", da kann man dir nicht helfen!)

                Wenn in dieser Schicht eine Schichtnummer exitier soll sie ausgegeben werden. SIehe hier:

                <xsl:for-each select="//child::*[contains(local-name(), 'Schicht')]"> <xsl:if test="position()  = $positionsnummer">

                xsl:choose

                <xsl:when test="boolean(Schichtnummer)">

                <xsl:for-each select="//child::*[contains(local-name(), 'Schicht')]">

                <xsl:if test="position()  = $positionsnummer">

                <xsl:value-of select="Schichtnummer"></xsl:value-of>

                Und was soll das bewirken, außer gar nichts? Du macht zwei mal dasselbe, weil du beide mal vom Wurzelelement ausgehst "//child::*"

                Was du hier machst ist folgendes:

                1. Suche mir alle Kindelemente eines Elements ausgehend vom Wurzelelement in dessen Namen "Schicht" vorkommt. (sprich du machst nichts anderes als: //*[...])

                angewendet auf dein XML:

                <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:template match="/test">   <html>    <head>     <title>Untitled</title>    </head>    <body>     <xsl:for-each select="//*[contains(local-name(), 'Schicht')]">      &lt;<xsl:value-of select="local-name()" />&gt;      <br />     </xsl:for-each>    </body>   </html>  </xsl:template> </xsl:stylesheet>

                Ergebniss:

                <Schicht1> <Schicht2> <Schichtnummer> <Schicht3> <Schicht4> <Schichtnummer> <Schicht5> <Schichtnummer>

                sprich: du hast brav alle Elemente ausgewählt.

                1. Teste ob "position()  = $positionsnummer" ist. Tja, ich weiss aber nicht, was bei dir in der Variable "$positionsnummer" steht, denn das sagst du nicht. Aber die Positionen deiner Elemente von deinem XML-Beispiel schaut so aus: <Schicht1>:1 <Schicht2>:2 <Schichtnummer>:3 <Schicht3>:4 <Schicht4>:5 <Schichtnummer>:6 <Schicht5>:7 <Schichtnummer>:8

                2. wenn also "position()  = $positionsnummer" ist, teste ob im aktuellen Element ein Kindelement "Schichtnummer" gibt. (Dazu reicht übrigens <xsl:when test="Schichtnummer"> aus.)

                Laut deiner Aussage soll hier die Schichtnummer ausgegeben werden. Machst du aber nicht, sonder:

                1. du sagst wie beim Schritt 1: Suche mir alle Kindelemente eines Elements ausgehend vom Wurzelelement in dessen Namen "Schicht" vorkommt. (sprich du machst nichts anderes als: //*[...]) und selektierst wieder alle Elemente)

                Wenn du jetzt anschaust was du macht: (ich habe hier $positionsnummer eingeführt)

                <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:template match="/test">   <html>    <head>     <title>Untitled</title>    </head>    <body>     <xsl:for-each select="//[contains(local-name(), 'Schicht')]">      <xsl:variable name="positionsnummer" select="position()" />      &lt;<xsl:value-of select="local-name()" />&gt;:<xsl:value-of select="position()" />:<xsl:value-of select="$positionsnummer" />      <xsl:if test="position() = $positionsnummer">       xsl:choose        <xsl:when test="Schichtnummer">         <xsl:for-each select="//[contains(local-name(), 'Schicht')]">          <br />          &lt;<xsl:value-of select="local-name()" />&gt;:<xsl:value-of select="position()" />:<xsl:value-of select="$positionsnummer" />         </xsl:for-each>        </xsl:when>       </xsl:choose>      </xsl:if>      <br />     </xsl:for-each>    </body>   </html>  </xsl:template> </xsl:stylesheet>

                Hast du gerade: (El.Name : aktuelle Position : gespeicherte Pos.) <Schicht1>:1:1 <Schicht2>:2:2    <Schicht1>:1:2    <Schicht2>:2:2    <Schichtnummer>:3:2    <Schicht3>:4:2    <Schicht4>:5:2    <Schichtnummer>:6:2    <Schicht5>:7:2    <Schichtnummer>:8:2 <Schichtnummer>:3:3 <Schicht3>:4:4 <Schicht4>:5:5    <Schicht1>:1:5    <Schicht2>:2:5    <Schichtnummer>:3:5    <Schicht3>:4:5    <Schicht4>:5:5    <Schichtnummer>:6:5    <Schicht5>:7:5    <Schichtnummer>:8:5 <Schichtnummer>:6:6 <Schicht5>:7:7    <Schicht1>:1:7    <Schicht2>:2:7    <Schichtnummer>:3:7    <Schicht3>:4:7    <Schicht4>:5:7    <Schichtnummer>:6:7    <Schicht5>:7:7    <Schichtnummer>:8:7 <Schichtnummer>:8:8

                1. jetzt sagt du wieder: teste ob "position()  = $positionsnummer" ist und wenn ja, gib "Schichtnummer" aus. Ändern wir den Teil des XSLs dementsprechend:

                xsl:choose        <xsl:when test="Schichtnummer">         <xsl:for-each select="//*[contains(local-name(), 'Schicht')]">          <br />          <xsl:if test="position()  = $positionsnummer">           &#160;&#160;&#160;&lt;<xsl:value-of select="local-name()" />&gt;:<xsl:value-of select="position()" />:<xsl:value-of select="$positionsnummer" />:<xsl:value-of select="Schichtnummer" />          </xsl:if>         </xsl:for-each>        </xsl:when>       </xsl:choose>

                Ergebniss:

                <Schicht1>:1:1 <Schicht2>:2:2    <Schicht2>:2:2:123 <Schichtnummer>:3:3 <Schicht3>:4:4 <Schicht4>:5:5    <Schicht4>:5:5:20 <Schichtnummer>:6:6 <Schicht5>:7:7    <Schicht5>:7:7:2 <Schichtnummer>:8:8

                Wie du siehst, bekommst du schon hier alle Schichtnummern ausgegeben. Ich hoff dir ist es nun auch klar warum.

                Dann gehst du aber noch einen Schritt weiter:

                1. und sagst als Gegensatz zu Schritt 3: wenn im aktuellen Element kein Kindelement "Schichtnummer" gibt, ... XSL-Teil angepasst:

                xsl:choose        <xsl:when test="Schichtnummer">         <xsl:for-each select="//[contains(local-name(), 'Schicht')]">          <br />          <xsl:if test="position()  = $positionsnummer">           &lt;<xsl:value-of select="local-name()" />&gt;:<xsl:value-of select="position()" />:<xsl:value-of select="$positionsnummer" />:<xsl:value-of select="Schichtnummer" />          </xsl:if>         </xsl:for-each>        </xsl:when>        <xsl:when test="not(Schichtnummer)">         <xsl:for-each select="//[contains(local-name(), 'Schicht')]">          <br />          <xsl:if test="position()  &gt; $positionsnummer">           -&lt;<xsl:value-of select="local-name()" />&gt;:<xsl:value-of select="position()" />:<xsl:value-of select="$positionsnummer" />:<xsl:value-of select="Schichtnummer" />          </xsl:if>         </xsl:for-each>        </xsl:when>       </xsl:choose>

                Ergebnis: <Schicht1>:1:1       -<Schicht2>:2:1:123       -<Schichtnummer>:3:1:       -<Schicht3>:4:1:       -<Schicht4>:5:1:20       -<Schichtnummer>:6:1:       -<Schicht5>:7:1:2       -<Schichtnummer>:8:1: <Schicht2>:2:2    <Schicht2>:2:2:123 <Schichtnummer>:3:3       -<Schicht3>:4:3:       -<Schicht4>:5:3:20       -<Schichtnummer>:6:3:       -<Schicht5>:7:3:2       -<Schichtnummer>:8:3: <Schicht3>:4:4       -<Schicht4>:5:4:20       -<Schichtnummer>:6:4:       -<Schicht5>:7:4:2       -<Schichtnummer>:8:4: <Schicht4>:5:5    <Schicht4>:5:5:20 <Schichtnummer>:6:6       -<Schicht5>:7:6:2       -<Schichtnummer>:8:6: <Schicht5>:7:7    <Schicht5>:7:7:2 <Schichtnummer>:8:8

                Jetzt hast du also die Schichtnummer noch mal mehrfach.

                das geht auch alles, nun soll aber die erste Schichtnummer ausgegeben werde die gefunden wird, da ich nur die Schichtnummer haben will, die   in der am nächsten darunterliegenden Schicht haben will. Ich bekomme aber immer alle. Ich kann aber an der for-each nichts ändern, da dann das Prinzip mit meiner Positionsnummer nicht mehr geht!

                Ich weiss bzw. versteh beim besten Willen nicht, was du vorhast. Was ist das Prinzig deiner "Positionsnummer "?.  Bzw. mir ist das zu konfus was du erzählst. Wenn ich von dem Beispiel XML von oben ausgehe soll nach deiner Aussage:

                Beim Schicht1 soll die Schichtnummer aus Schicht1 angezeigt werden. Beim Schicht2 soll die (eigene) Schichtnummer angezeigt werden. Beim Schicht3 soll die Schichtnummer aus Schicht4 angezeigt werden. Beim Schicht4 soll die (eigene) Schichtnummer angezeigt werden. Beim Schicht5 soll die (eigene) Schichtnummer angezeigt werden.

                Dafür ist ein rekursives Template besser geeignet:

                <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:template match="/test">   <html>    <head>     <title>Untitled</title>    </head>    <body>     <xsl:apply-templates select="*[contains(local-name(), 'Schicht')]" />    </body>   </html>  </xsl:template>

                <xsl:template match="[contains(local-name(), 'Schicht')]">   xsl:choose    <xsl:when test="Schichtnummer">     &lt;<xsl:value-of select="local-name(.)" />&gt;:<xsl:value-of select="Schichtnummer" />     <br />    </xsl:when>    xsl:otherwise     <xsl:if test="">     &lt;<xsl:value-of select="local-name(.)" />&gt;(gefunden im: &lt;<xsl:value-of select="local-name(descendant::[contains(local-name(), 'Schicht')][Schichtnummer])" />&gt;):<xsl:value-of select="descendant::Schichtnummer" />     <br />     </xsl:if>    </xsl:otherwise>   </xsl:choose>   <xsl:apply-templates select="[contains(local-name(), 'Schicht')]" />  </xsl:template> </xsl:stylesheet>

                Egebniss:

                <Schicht1>(gefunden im: <Schicht2>):123 <Schicht2>:123 <Schicht3>(gefunden im: <Schicht4>):20 <Schicht4>:20 <Schicht5>:2

                Du brauchst nur überall das "&lt;<xsl:value-of select="local-name(.)" ..." löschen. Funktioniert auch bei tieferen Verschachtelung.

                Ich hoffe, dass diese das ist was du erreichen wolltest.

                Grüße Thomas

                1. Danke das sieht gut, werde ich mal anschauen!

  2. Hello out there!

    Ich habe ein XML-Dokument das aus verschiedenen Schichten besteht.
    Das einzige was bekannt ist, das im local-name() immer 'Schicht' vorkommt als so:

    <Schicht1></Schicht1>
    <Schicht2></Schicht2>
    <Schicht3></Schicht3>
    <Schicht4></Schicht4>

    Das sieht für mich nach schlechtem Markup aus. Wäre

    <Schicht xml:id="Schicht1"></Schicht>  
    <Schicht xml:id="Schicht2"></Schicht>  
    <Schicht xml:id="Schicht3"></Schicht>  
    <Schicht xml:id="Schicht4"></Schicht>
    

    nicht ein besseres Konzept?

    See ya up the road,
    Gunnar

    --
    „Wer Gründe anhört, kommt in Gefahr nachzugeben.“ (Goethe)
    1. Das habe ich keinen einfluss!