Majao: Transformation Navigation

Hallo,
ich habe für die nachfolgende XML Navigation (A) ein XSLT Stylesheet (B), das die Navigation in HTML transformiert und immer nur die Subseiten des entsprechenden Navigationspunkts anzeigt, die anderen verbirgt (Klappmenu). Das geht soweit.

Für eine andere Lösung möchte ich aber, dass die Navigation nur die drei obersten Punkte (Einleitung, Hauptteil, Schluss) zeigt. Die Subseiten (Kapitel)sollen in einer zweiten, eigenständigen Navigation angezeigt werden (ohne die Hauptpunkte). - Wenn ich also in der Navigation auf "Hauptteil" klicke, soll hier nichts weiter aufklappen, die Subseiten sollen vielmehr in einem zweiten Menufeld erscheinen - wieder als Klappmenu)

Leider weiss ich nicht, wie ich das lösen kann.

A. Das XML Dokument (Navigation):

  
<?xml version="1.0" encoding="UTF-8"?>  
<menue>  
    <topic href="Einführung_1.xml" text="Einführung">  
        <topic href="../Einführung_Sub_1_1.xml" text="Was ist ...."/>  
        <topic href="../Einführung_Sub_1_2.xml" text="Über ...."/>  
    </topic>  
    <topic href="Hauptteil_2.xml" text="Hauptteil">  
        <topic href="../Hauptteil_Sub_2_1.xml" text="Kapitel 1 ...."/>  
        <topic href="../Hauptteil_Sub_2_2.xml" text="Kapitel 2">  
            <topic href="../Hauptteil_Sub_2_2_1.xml" text="Kapitel 2.1"/>  
            <topic href="../Hauptteil_Sub_2_2_2.xml" text="Kapitel 2.2"/>  
        </topic>  
    </topic>  
    <topic href="Schluss_3.xml" text="Einführung">  
        <topic href="../Schluss_Sub_3_1.xml" text="Das wars ...."/>  
        <topic href="../Schluss_Sub_3_2.xml" text="Sonstiges ...."/>  
    </topic>  
</menue>  

B. Das XSLT Stylesheet (für das komplette Klappmenu)

  
    <xsl:template match="topic">  
        <xsl:variable name="textgroesse">  
            <xsl:choose>  
                <xsl:when test="count(ancestor::*)=1">11px</xsl:when>  
                <xsl:when test="count(ancestor::*)=2">11px</xsl:when>  
                <xsl:when test="count(ancestor::*)=3">11px</xsl:when>  
                <xsl:otherwise>11px</xsl:otherwise>  
            </xsl:choose>  
        </xsl:variable>  
        <xsl:variable name="fontweight">  
            <xsl:choose>  
                <xsl:when test="count(ancestor::*)=1">0px</xsl:when>  
                <xsl:when test="count(ancestor::*)=2">15px</xsl:when>  
                <xsl:when test="count(ancestor::*)=3">30px</xsl:when>  
                <xsl:otherwise>0</xsl:otherwise>  
            </xsl:choose>  
        </xsl:variable>  
        <xsl:choose>  
            <xsl:when test="descendant::topic[@href = $dateiname]">  
                <tr>   <td style="font-size:{$textgroesse}; ">  
                    <a href="{@href}" class="{@class}" style="padding-left:{$fontweight}; "><xsl:value-of select="@text"/></a></td></tr>  
                <xsl:apply-templates select="*"/>  
            </xsl:when>  
            <xsl:when test="@href = $dateiname">  
                <tr><td>  
                    <span style="font-size:{$textgroesse}; padding-left:{$fontweight};"><xsl:value-of select="@text"/> </span>   </td></tr>  
                <xsl:apply-templates select="*"/>  
            </xsl:when>  
            <xsl:otherwise>  
                <tr> <td>  
                    <a href="{@href}" class="{@class}" style="font-size:{$textgroesse}; padding-left:{$fontweight}; "><xsl:value-of select="@text"/></a>  
                </td></tr>  
            </xsl:otherwise>  
        </xsl:choose>  
    </xsl:template>  
  

Kann mir jemand helfen?
Vielen Dank
M.

  1. Hallo,

    ich habe für die nachfolgende XML Navigation (A) ein XSLT Stylesheet (B), das die Navigation in HTML transformiert und immer nur die Subseiten des entsprechenden Navigationspunkts anzeigt, die anderen verbirgt (Klappmenu). Das geht soweit.

    Für eine andere Lösung möchte ich aber, dass die Navigation nur die drei obersten Punkte (Einleitung, Hauptteil, Schluss) zeigt. Die Subseiten (Kapitel)sollen in einer zweiten, eigenständigen Navigation angezeigt werden (ohne die Hauptpunkte). - Wenn ich also in der Navigation auf "Hauptteil" klicke, soll hier nichts weiter aufklappen, die Subseiten sollen vielmehr in einem zweiten Menufeld erscheinen - wieder als Klappmenu)

    Ich verstehe leider nicht was du erreichen möchest bzw. was du hier beschreibst und dein XSLT-Fragment trägt für mich auch nicht dazu bei, dass deine Frage mit Aufklappen etc. mir klarer werde.

    Grüße
    Thomas

    1. Ich verstehe leider nicht was du erreichen möchest bzw. was du hier beschreibst und dein XSLT-Fragment trägt für mich auch nicht dazu bei, dass deine Frage mit Aufklappen etc. mir klarer werde.

      Grüße
      Thomas

      Vielen Dank für die Antwort
      Ich habe ein XML Dokument, dass das gesamte Verzeichnis einer Webseite enthält.
      Ich möchte aber nicht das gesamte Verzeichnis in einer einzigen Navigation auflisten. Dafür habe ich eine Lösung, aus der das XSLT Fragment entnommen ist.

      Vielmehr
      Ich brauche einen Bereich (DIV), in dem nur die Elemente der ersten Ordnung angezeigt werden (Einleitung, Hauptteil, Schluss = was  als Hauptnavigation immer sichtbar bleiben soll)  - und einen zweiten Bereich (DIV), der erst auf der ausgewählten Seite erscheint, beispielsweise auf der Seite "Hauptteil", und dort  alle untergeordneten Elemente (Subseiten und SubSubSeiten  des Hauptteils) in Form eines Klappmenus bereitstellt.

      Das XSLT Fragment sollte nur zeigen, wie ich das mit dem Klappmenu gelöst habe. Das funktioniert ja auch. Aber eben nur in eine Navigation, die alles enthält.
      Was nicht funktioniert, ist die Aufteilung auf zwei Bereiche (DIVs) im HTML Dokument.  (1. Bereich nur die Elemente erster Ordnung, 2. Bereich allen nachgeordneten Elemente)

      Hoffentlich konnte ichs ein wenig verständlicher sagen   :-)

      1. Hallo,

        Vielen Dank für die Antwort
        Ich habe ein XML Dokument, dass das gesamte Verzeichnis einer Webseite enthält.
        Ich möchte aber nicht das gesamte Verzeichnis in einer einzigen Navigation auflisten. Dafür habe ich eine Lösung, aus der das XSLT Fragment entnommen ist.

        Vielmehr
        Ich brauche einen Bereich (DIV), in dem nur die Elemente der ersten Ordnung angezeigt werden (Einleitung, Hauptteil, Schluss = was  als Hauptnavigation immer sichtbar bleiben soll)  - und einen zweiten Bereich (DIV), der erst auf der ausgewählten Seite erscheint, beispielsweise auf der Seite "Hauptteil", und dort  alle untergeordneten Elemente (Subseiten und SubSubSeiten  des Hauptteils) in Form eines Klappmenus bereitstellt.

        Auf Grund deines XMLs würde ich es so machen:

        Globaler Parameter "dateiname" wird an den XSLT-Prozessor übergeben, wohl vom Script dass bei die die XML/XSLT-TRanformation macht.

        Zwei Templates für menu mit verschiedenen Modi.

        • Der erste liest nur die topics aus, die dirket unter menu stehen.
        • Der zweite wird dann aktiv wenn der Paramter zutrifft und dann ruft er für das aktuelle topic, den eigentlichen "Topic-Template", der seinerseits rekursiv nach unten die Listen generiert.

        Ich würde dir dringend von Tabellen und solchen Einrückungen, wie du es gemacht hast abraten. Für Navigation(en) sind Listen in 99.99% der Fälle die perfekte Lösung.

        Ob du das mit "ausklappen" und "einklappen" über CSS löst oder JavaScript, muss du dann entscheiden.

        Du kannst dir auch eine vorschauseite wie z.B.
        http://redaktion.selfhtml.org/selfhtml-preview/html/allgemein/validitaet.html ansehen, wie dort die verschiedenen Navigationen gelöst sind (z.B. der bread crumb trail).

        Ich erwähne es nur, denn ich denke nicht dass dir das weiterhilft (weil es ev. zu kompliziert) - dass wir für die Generierung der Doku ebenfalls eine zentrale Indexdatei verwenden und daraus alle Navigationen erzeugen. Code im SVN: https://redaktion.selfhtml.org/browser/selfhtml/trunk)

        Grüße
        Thomas

          
             <xsl:param name="dateiname" />  
             <xsl:template match="/">  
                <xsl:apply-templates select="menu" mode="obersteEbene" />  
          
                <xsl:apply-templates select="menu" mode="untereEbenen">  
                    <xsl:with-param name="parentTopic" select="$dateiname" />  
                </xsl:apply-templates>  
            </xsl:template>  
          
            <xsl:template match="menu" mode="obersteEbene">  
                <h1>Hauptnavigation</h1>  
                <ul>  
                    <xsl:for-each select="topic">  
                        <li>  
                            <xsl:value-of select="@text"/>  
                        </li>  
                    </xsl:for-each>  
                </ul>  
            </xsl:template>  
            <xsl:template match="menu" mode="untereEbenen">  
                <xsl:param name="parentTopic" />  
                <h2>Seiten in diesem Bereich</h2>  
                <ul>  
                    <xsl:for-each select="topic[@href = $parentTopic]">  
                        <xsl:apply-templates select="." />  
                    </xsl:for-each>  
                </ul>  
            </xsl:template>  
            <xsl:template match="topic">  
                <li>  
                    <a href="{@href}">  
                        <xsl:value-of select="@text"/>  
                    </a>  
                    <xsl:for-each select="topic">  
                        <ul>  
                            <xsl:apply-templates select="." />  
                        </ul>  
                    </xsl:for-each>  
                </li>  
            </xsl:template>  
        
        
  2. PS

    Die Element- und Attributnamen sind mitunter missverständlich bzw falsch gewählt, es ist  alles noch im Enturf