Transformation Navigation
Majao
- xsl
0 Thomas J.S.0 Manfred
0 ManfredJ.
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.
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
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 :-)
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.
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>
PS
Die Element- und Attributnamen sind mitunter missverständlich bzw falsch gewählt, es ist alles noch im Enturf