Announcement

Collapse
No announcement yet.

Aus sequentiellen Strukturen hierarchische bauen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Aus sequentiellen Strukturen hierarchische bauen

    Hi,
    ich muss mittels XSLT2.0 aus einer sequentiellen Struktur eine hierarchische produzieren.
    Die Hierarchieinformation kommt aus dem Attribut "hier" welches den Titel des Elternkapitel enthält :
    Code:
    <kap>
    <title>Kapitel 1</title>
    Hier steht der Text</kap>
    <kap>
    <title>Kapitel 2</title>
    Hier steht der Text
    </kap>
    <kap hier="Kapitel 2">
    <title>Kapitel 2.1</title>
    Hier steht der Text
    </kap>
    <kap hier="Kapitel 2">
    <title>Kapitel 2.2</title>
    Hier steht der Text
    </kap>
    <kap hier="Kapitel 2.2">
    <title>Kapitel 2.2.1</title>
    Hier steht der Text
    </kap>
    <kap hier="Kapitel 2.2">
    <title>Kapitel 2.2.2</title>
    Hier steht der Text
    </kap>
    <kap>
    <title>Kapitel 3</title>
    Hier steht der Text
    </kap>
    Das Ganze soll dann so aussehen:
    Code:
    <kap title="Kapitel 1"/>
    <kap title="Kapitel 2">
       <kap title="Kapitel 2.1"/>
       <kap title="Kapitel 2.2">
            <kap title="Kapitel 2.2.1"/>
            <kap title="Kapitel 2.2.2"/>
       </kap>
    </kap>
    <kap title="Kapitel 3"/>
    ich habe zwar einen umständlichen Weg gefunden, der hat aber den Nachteil, dass die Hierarchietiefe vom Stylesheet abhängig ist.

    Dabei schaut das Stylesheet bei der Produktion eines Kapitels, ob es nachfolgende Kapitel mit einem Attribut "hier" gibt, die den gleichen Wert wie der Titel des gegenwärtigen Kapitels haben.

    Für jede Schachtelungstiefe muss das Stylesheet nachsehen, ob es eventuell Unterkapitel gibt. So schaut das stylesheet aus:
    Code:
    <xsl:for-each select="root/*">
    <!--
    1. EBENE
    testet ob das Topic KEIN "hier"-Attribut hat, also auf oberster Ebene steht. -->
    
      <xsl:if test="not(@hier)">
          <xsl:variable name="kap1" select="./title" />
    
             <kap>
    
    		<xsl:attribute name="title">
    			<xsl:value-of select="./title" />
    		</xsl:attribute>
    
    <!--
    2.EBENE
    testet, ob es Topics im Dokument gibt, die ein "hier"
    Att haben, dass den selben Inhalt hat wie der gegenwärtige Topic-Titel hat. -->
    
    		<xsl:for-each select="//* [@hier = $kap1]">
    			<xsl:variable name="kap2" select="./title" />
    
    			<kap>
    
    				<xsl:attribute name="title">
    					<xsl:value-of select="./title" />
    				</xsl:attribute>
    
    	
    <!--
    3.EBENE
     -->
    			<xsl:for-each select="//* [@hier = $kap2]">
    				<xsl:variable name="kap3" select="./title" />
    								
    				<kap>
    
    					<xsl:attribute name="title">
    						<xsl:value-of select="./title" />
    					</xsl:attribute>
    
    <!--
    4.EBENE
    -->
    
    					<xsl:for-each
    ...
    ...
    ...
    Hat jemand eine Idee wie man das sauberer löst, so dass nicht für jede Schachtelungstiefe wieder eine For-Each-Schleife gebaut werden muss?
    Zuletzt editiert von sano; 14.05.2007, 14:10.

  • #2
    Lösung

    Ein rekursives Template ist die Antwort (Ein Template, das sich selbst aufrufen kann):
    Code:
    <xsl:template name="root">
    
        <xsl:for-each select="root/*[not(@hier)]">
    	<xsl:call-template name="Hierarchie" />
        </xsl:for-each>
    
    </xsl:template>
    
    
    <xsl:template name="Hierarchie">
    		
        <kap>
    	<xsl:variable name="kapTit" select="./title" />
            <xsl:attribute name="title">
                <xsl:value-of select="./title" />
            </xsl:attribute>
    								
            <xsl:choose>
                <xsl:when test="following-sibling::*[@hier = $kapTit]">
    			
    	        <xsl:for-each select="following-sibling::*[@hier = $kapTit]">
    		    <xsl:call-template name="ditamapHier"/>
    	        </xsl:for-each>
    			
    	    </xsl:when>
            </xsl:choose>
        </kap>
    </xsl:template>
    So schaut das ganze doch schon viel besser aus!
    Zuletzt editiert von sano; 15.05.2007, 11:59.

    Comment


    • #3
      Hier gibts eine noch efizientere Lösung...

      http://www.tutorials.de/forum/xml/27...h-wandeln.html

      Comment

      Working...
      X