Verlinktes Inhaltsverzeichnis erstellen
Bastian G.
- xsl
Hallo XSL(T)-Wizzards,
Zu vielen gegebenen XML Datei(en), die ich nicht verändern darf, soll ich durch XSLT eine HTML erzeugen - soweit so gut alles klein Problem. Jetzt möchte ich noch ein klickbares Inhaltsverzeichnis generieren, wie man das kennt: Im HTML oben stehen dann die Links und bei Klick darauf wird zur jeweiligen Stelle gesprungen.
Das XML sieht so aus (stark vereinfacht)
<root>
<inhaltsverzeichnis>
<inhalt>link1</inhalt>
<inhalt>link2</inhalt>
</inhaltsverzeichnis>
...
<content>
<inhaltstitel>link1-titel</inhaltsitel><text>lorem.ipsum1</text>
<inhaltstitel>link2-titel</inhaltsitel><text>lorem.ipsum2</text>
</content>
</root>
--------------------------------------
Auszug aus meinem bisherigem XSL:
<xsl:template match="//inhaltsverzeichnis/inhalt">
<xsl:for-each select=".">
<p>
<a href="#{generate-id()}"><xsl:value-of select="text()"/></a>
</p>
</xsl:for-each>
</xsl:template>
...
<xsl:template match="//content">
<xsl:for-each select="inhaltstitel">
<h3><a name="{generate-id(//inhaltverzeichnis/inhalt)}"><xsl:value-of select="text()"/></a></h3>
</xsl:for-each>
</xsl:template>
Im HTML wird mir nur für das Inhaltsverzeichnis (oben) IDs in das a href geschrieben, und genau die gleiche ID benötige ich nun für das a name im Content (unten). Wie "übernehme" ich diese ID? - das der Sprunganker von oben nach unten funktioniert. Bzw. wo ist mein Denkfehler? Bin dankbar für jegliche Hinweise, viele Grüße aus Stuttgart :)
@@Bastian G.:
nuqneH
<h3><a name="{generate-id(//inhaltverzeichnis/inhalt)}"><xsl:value-of select="text()"/></a></h3>
Was soll denn das? a[@name] für Sprungmarken ist seit Urzeiten überflüssig; jedes Element mit @id kann angesprungen werden:
<h3 id="…">…</h3>
Wie "übernehme" ich diese ID?
Gar nicht. Du hast sie doch im Inhalt der 'inhaltstitel'-Elemente ("link1-titel") zur Verfügung, du musst lediglich das "-titel" abschneiden. XPath: http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm#substring@title=substring(), http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm#string_length@title=string-length().
Qapla'
Hallo Gunnar,
Danke für deine Antwort, aber ich kann dir nicht ganz folgen :(
Das a[@name] überflüssig ist, habe ich soweit verstanden, dann werde ich einfach das <h3> anspringen wie du geschrieben hast.
Allerdings, habe ich doch für das Element keine ID, die möchte ich mir ja oben im Inhaltsverzeichnis erzeugen. Diese Inhaltsverzeichnis-links bekommen dann nen <a href="#erzeugte_id">
Und diese erzeugt ID, soll dann unten (im Content) auch bekannt sein und in ebenjenes <h3 id="..."> eingesetzt werden, sodass der Sprung funktioniert.
Ausschneiden mit Substring muss ich nichts, der Inhalt den ich da gewählt hatte ("link1-titel") war einfach nur zur Demo.
p.s. ich kann leider kein klingonisch
@@Bastian G.:
nuqneH
<h3><a name="{generate-id(//inhaltverzeichnis/inhalt)}"><xsl:value-of select="text()"/></a></h3>
Was soll denn das? a[@name] für Sprungmarken ist seit Urzeiten überflüssig; jedes Element mit @id kann angesprungen werden:
<h3 id="…">…</h3>
Wie "übernehme" ich diese ID?
Gar nicht. Du hast sie doch im Inhalt der 'inhaltstitel'-Elemente ("link1-titel") zur Verfügung, du musst lediglich das "-titel" abschneiden. XPath: http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm#substring@title=substring(), http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm#string_length@title=string-length().
Qapla'
@@Bastian G.:
nuqneH
Ausschneiden mit Substring muss ich nichts, der Inhalt den ich da gewählt hatte ("link1-titel") war einfach nur zur Demo.
Wie sieht dem dein XML nun wirklich aus? Woraus willst du die IDs generieren: aus 'inhaltsverzeichnis/inhalt' oder aus 'content/inhaltstitel'? Wenn letzteres, wozu dient 'inhaltsverzeichnis'?
p.s. ich kann leider kein klingonisch
Ich kann auch nur die Touri-Floskeln.
Qapla'