Patrick: <title> per XSL generieren

Hallo Leser!

Ich möchte den Titel einer Seite per XSL generieren da ich für einen gewissen Seitentyp ein sogenanntes "Webcontnet-Template" habe. Dieses EINE Template wird für mehrere Seiten angewandt. Deswegen kann ich den Seitentitel nicht fix reinschreiben sondern muss ihn durch entsprechende XSL Befehle "dynamisch" generieren lassen.

######## Webcontent Template Start ##############

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
.
.
.

<xsl:template match="/">

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>Treehouse café - <xsl:call-template name="main"/>: <xsl:call-template name="sub"/></title>
    .
    .
    .
    </head>

</xsl:template>

.
.
.

<xsl:template name="main">
    <xsl:if test="string(/data/nav/mainnav/@pageId)">
    <xsl:value-of select="/data/nav/mainnav"/>
    </xsl:if>
    </xsl:template>

<xsl:template name="sub">
    <xsl:for-each select="/data/submenu">
    <xsl:value-of select="item"/>
    </xsl:for-each>
    </xsl:template>

######## Webcontent Template Ende##############

Mein Problem ist, dass nur immer dass erste Element von "main" (also der erste Hauptnavigationspunkt: Tree House Cafe) und dass erste Element von "sub" angezeigt wird (z.b. About the cafe/About the Library etc.)

in einer anderen Variante werden alle menüitems hintereinander in den Seitentitel geschrieben.

<xsl:template name="main">
<xsl:for-each select="/data/nav">
xsl:choose
<xsl:when test="string(./mainnav/@pageId)">
<xsl:value-of select="./mainnav"/>
</xsl:when>
xsl:otherwise
<xsl:value-of select="./mainnav"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>

Ich komme nicht auf die richtige Lösung. Bitte um Hilfe!

http://www.treehousecafe.org/index.php?pageId=9

#####################XML Datei########################

  • <data>
    .
    .
    .
  • <nav>
      <mainnav pageId="9" adminPageId="">Tree House Cafe</mainnav>
  • <subnav>
      <item pageId="9" adminPageId="10">About the Cafe</item>
      <item pageId="11" adminPageId="">Staff profiles</item>
      <item pageId="13" adminPageId="">Volunteer profiles</item>
      <item pageId="15" adminPageId="16">Refurbishment info</item>
      </subnav>
      </nav>
  • <nav>
      <mainnav pageId="17" adminPageId="">Children's Peace Libary</mainnav>
  • <subnav>
      <item pageId="17" adminPageId="18">About the Libary</item>
      <item pageId="19" adminPageId="20">Events</item>
      <item pageId="21" adminPageId="">Book catalogue</item>
      <item pageId="23" adminPageId="24">Resource for schools</item>
      </subnav>
      </nav>
  • <nav>
      <mainnav pageId="25" adminPageId="">Bradford Centre for NV</mainnav>
  • <subnav>
      <item pageId="25" adminPageId="26">About the Centre</item>
      <item pageId="27" adminPageId="28">Relation to the cafe</item>
      <item pageId="29" adminPageId="30">Organisational structure</item>
      <item pageId="31" adminPageId="32">Resource for nonviolence</item>
      </subnav>
      </nav>
  • <nav>
      <mainnav pageId="33" adminPageId="">Getting Involved</mainnav>
  • <subnav>
      <item pageId="33" adminPageId="">Becoming a member</item>
      <item pageId="35" adminPageId="36">Becoming a director</item>
      <item pageId="37" adminPageId="38">Projects</item>
      <item pageId="39" adminPageId="40">Visioning events</item>
      </subnav>
      </nav>
  • <nav>
      <mainnav pageId="41" adminPageId="42">City of Bradford</mainnav>
      <subnav />
      </nav>
  • <nav>
      <mainnav pageId="4" adminPageId="">What's on</mainnav>
      <subnav />
      </nav>
  • <nav>
      <mainnav pageId="51" adminPageId="">Forum</mainnav>
  • <subnav>
      <item pageId="56" adminPageId="">Login</item>
      <item pageId="52" adminPageId="">Register</item>
      <item pageId="51" adminPageId="">Overview</item>
      </subnav>
      </nav>
  • <submenu>
      <item pageId="9">Tree House Cafe</item>
      <item pageId="17">Children's Peace Libary</item>
      <item pageId="25">Bradford Centre for NV</item>
      <item pageId="33">Getting Involved</item>
      <item pageId="41">City of Bradford</item>
      <item pageId="4">What's on</item>
      <item pageId="51">Forum</item>
      </submenu>
    .
    .
    .
  1. Hi Patrick!

    <xsl:template name="main">
        <xsl:if test="string(/data/nav/mainnav/@pageId)">
        <xsl:value-of select="/data/nav/mainnav"/>
        </xsl:if>
        </xsl:template>

    bedeutet: wenn /data/nav/mainnav[1]/@pageId (die [1] wird von xsl automatisch angenommen)  ein String ist, dann gib /data/nav/mainnav[1] aus.
    => Browser hat recht.

    <xsl:template name="main">
    <xsl:for-each select="/data/nav">
    xsl:choose
    <xsl:when test="string(./mainnav/@pageId)">
    <xsl:value-of select="./mainnav"/>
    </xsl:when>
    xsl:otherwise
    <xsl:value-of select="./mainnav"/>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:for-each>
    </xsl:template>

    bedeutet: für jeden Knoten in (Knotenliste) /data/nav:
    wenn dieses Knotens Subknoten ./mainnav[1]/@pageId ein string ist, dann gib den Subknoten ./mainnav[1] aus,
    ansonsten gib den Subknoten ./mainnav[1] aus.
    => gibt also alle knoteninhalte der Gestalt /data/nav/mainnav[x]/. aus. => Browser hat wieder recht.

    Womit du dich mal beschäftigen solltest, ist:
    http://de.selfhtml.org/xml/darstellung/xsltelemente.htm#param
    http://de.selfhtml.org/xml/darstellung/xsltelemente.htm#with_param

    Grüsse, Richard

  2. Hallo,

    Ich möchte den Titel einer Seite per XSL generieren da ich für einen gewissen Seitentyp ein sogenanntes "Webcontnet-Template" habe. Dieses EINE Template wird für mehrere Seiten angewandt. Deswegen kann ich den Seitentitel nicht fix reinschreiben sondern muss ihn durch entsprechende XSL Befehle "dynamisch" generieren lassen.

    Hier muss du einen Parameter definieren, und in deinem PHP-Skript dafür sorgen, dass er diesen Paramter befüllt:

      
    $proc = new XSLTProcessor;  
      
    ...  
      
    $proc->setParameter('', 'pageId', $Wert);  
    
    

    wobei du $Wert aus dem URL holst(index.php?pageId=9)

      
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">  
    <xsl:param name="pageId" />  
    
    

    Mein Problem ist, dass nur immer dass erste Element von "main" (also der erste Hauptnavigationspunkt: Tree House Cafe) und dass erste Element von "sub" angezeigt wird (z.b. About the cafe/About the Library etc.)

    Hm, was sollte denn bei "sub" angezeigt werden?
    Du willst einen bread-crumb-trail im Titel anzeigen? In etwas so?

    Treehouse café - Hauptnavigationspunkt: Unternavigationspunkt

    Aufgrund deines Beisiel-XMLs:

      
    <?xml version="1.0" encoding="UTF-8"?>  
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
     <xsl:param name="pageId" />  
     <xsl:template match="/">  
      <html>  
       <head>  
        <title>Treehouse café - <xsl:call-template name="seitentitel" /></title>  
       </head>  
      </html>  
     </xsl:template>  
     <xsl:template name="seitentitel">  
      <xsl:param name="ID" select="$pageId"/>  
      <xsl:choose>  
       <xsl:when test="/data/nav/subnav/item[@pageId = $ID]">  
        <xsl:value-of select="/data/nav/subnav[item[@pageId = $ID]]/preceding-sibling::mainnav"/>: <xsl:value-of select="/data/nav/subnav/item[@pageId = $ID]"/>  
       </xsl:when>  
       <xsl:otherwise>  
        <xsl:value-of select="/data/nav/mainnav[@pageId = $ID]"/>  
       </xsl:otherwise>  
      </xsl:choose>  
     </xsl:template>  
    </xsl:stylesheet>  
    
    

    Das würde bei pageId=15: "Treehouse café - Tree House Cafe:  Refurbishment info" und bei pageId=41: "Treehouse café - City of Bradford" produzieren.

    Grüße
    Thomas