C-One: Parameterübergabe an xsl

Hallo zusammen,

ich hab da folgendes Problem:
Ich habe eine Reihe von Publikationen, die chronologisch geordnet sind. Ich habe eine Komplettansicht aller Publikationen und dann jeweils eine Jahresansicht und eine Detailansicht. Meine Ordnerhierachie ist demnach auch so aufgebaut (root/year/id).

Meine Detailansicht besteht aus einem xslt-file und einer index.php. Da das xslt-file ja bei jeder Detailansicht dieselbe ist, wollte ich meine Ordnerhierachie ausnutzen, um die Parameter nicht jedesmal von Hand ändern zu müssen, so dass das php-file gleich die passenden Parameter übergibt. Ich wollte nun die URL auslesen und dann 2 Variable anlegen (year, id). Nun weiß ich jedoch nicht, wie ich die entsprechenden Parameter übergeben kann.

Index.php ruft per
<?php IncludeXml("../../data.xml","detail.xslt"); ?>
die Dateien auf.

In der xslt-Datei ändere ich die Parameter immer noch manuell:
<xsl:variable name="id">07</xsl:variable>
<xsl:variable name="year">2007</xsl:variable>

Die dazugehörige URL würde dementsprechend /root/2007/07 lauten.

Wäre schön, wenn ihr mir helfen könntet.

Viele Grüße

  1. Hallo,

    <?php IncludeXml("../../data.xml","detail.xslt"); ?>

    Diese Funktion gehört nicht zum Standardumfang von PHP und ist vermutlich von Dir geschrieben, daher müsstest Du uns schon den Sourcecode dieser Funktion zeigen...

    In der xslt-Datei ändere ich die Parameter immer noch manuell:
    <xsl:variable name="id">07</xsl:variable>
    <xsl:variable name="year">2007</xsl:variable>

    In die XSL-Datei gehört - wenn Du Parameter verwenden willst - sowas wie:

    <xsl:param name="id" />  
    <xsl:param name="year" />
    

    Und wenn Du in PHP die XSL-Datei aufrufst, dann wirst Du ja in Deiner PHP-Funktion irgendwas machen wie:

    $doc = new DOMDocument ();  
    $xslt = new XSLTProcessor ();  
      
    $doc->load ($xslt_filename);  
    $xslt->importStyleSheet ($doc);  
      
    $doc->load ($xml_filename);  
    $html_code = $xslt->transformToXML ($doc);
    

    In dem Fall kannst Du einfach VOR dem transformToXML-Aufruf ein:

    $xslt->setParameter ('', 'year', $year);  
    $xslt->setParameter ('', 'id', $id);
    

    Das sorgt dann dafür, dass die Parameter im XSLT verfügbar sind.

    Die Doku zu den XSLT-Funktionen findest Du auf der PHP-Seite.

    Viele Grüße,
    Christian

    1. Hallo,

      danke erstmal für deine Antwort.

      Hallo,

      <?php IncludeXml("../../data.xml","detail.xslt"); ?>

      Diese Funktion gehört nicht zum Standardumfang von PHP und ist vermutlich von Dir geschrieben, daher müsstest Du uns schon den Sourcecode dieser Funktion zeigen...

      // ------------------------------------------------------------
          // Function for including an XL data source (lika an RSS feed)
          // rendered with a specified XSLT file.
          // ------------------------------------------------------------
          function IncludeXml($xml_url, $xslt_file)
          {
            // Get RSS Content
            $handle = fopen($xml_url, "r");
            $content = "";
            $content .= fread($handle, 8192);

      while (!feof($handle)) {
              $content .= fread($handle, 8192);
            }
            fclose($handle);
            if( !$domXmlObj = domxml_open_mem($content) ) {
              die( "Cannot parse the rss feed." );
            }

      // Transform
            $domXsltObj = domxml_xslt_stylesheet_file( $xslt_file );
            $domTranObj = $domXsltObj->process( $domXmlObj );
            echo $domXsltObj->result_dump_mem( $domTranObj );
          }

      In der xslt-Datei ändere ich die Parameter immer noch manuell:
      <xsl:variable name="id">07</xsl:variable>
      <xsl:variable name="year">2007</xsl:variable>

      In die XSL-Datei gehört - wenn Du Parameter verwenden willst - sowas wie:

      <xsl:param name="id" />

      <xsl:param name="year" />

      
      >   
      > Und wenn Du in PHP die XSL-Datei aufrufst, dann wirst Du ja in Deiner PHP-Funktion irgendwas machen wie:  
      >   
      > ~~~php
      
      $doc = new DOMDocument ();  
      
      > $xslt = new XSLTProcessor ();  
      >   
      > $doc->load ($xslt_filename);  
      > $xslt->importStyleSheet ($doc);  
      >   
      > $doc->load ($xml_filename);  
      > $html_code = $xslt->transformToXML ($doc);
      
      

      In dem Fall kannst Du einfach VOR dem transformToXML-Aufruf ein:

      $xslt->setParameter ('', 'year', $year);

      $xslt->setParameter ('', 'id', $id);

      
      >   
      > Das sorgt dann dafür, dass die Parameter im XSLT verfügbar sind.  
      >   
      > Die Doku zu den XSLT-Funktionen findest Du [auf der PHP-Seite](http://www.php.net/manual/en/ref.xsl.php).  
        
      Der bringt mich irgendwie noch nicht so recht weiter.  
        
      
      >   
      > Viele Grüße,  
      > Christian  
      > 
      
      1. Hallo,

        $domTranObj = $domXsltObj->process( $domXmlObj );

        Ah, ok, da verwendest Du noch die alten PHP-Funktionen dafür, in dem Fall musst Du folgendes machen:

        $params = array (  
          'year' => $year,  
          'id' => $id  
        );  
        $domTranObj = $domXsltObj->process ($domXmlObj, $params);
        

        (Wobei Du natürlich in der Funktion auf geeignete Weise an $year und $id kommen musst - wie, sei Dir überlassen.)

        (Siehe auch die Doku zu DomXsltStylesheet->process() sowie domxml_xslt_stylesheet_file)

        Und was ich über die XSLT-Datei schrieb...

        In der xslt-Datei ändere ich die Parameter immer noch manuell:
        <xsl:variable name="id">07</xsl:variable>
        <xsl:variable name="year">2007</xsl:variable>

        In die XSL-Datei gehört - wenn Du Parameter verwenden willst - sowas wie:

        <xsl:param name="id" />

        <xsl:param name="year" />

          
        ...gilt natürlich weiterhin.  
          
        Viele Grüße,  
        Christian  
        
        -- 
        [Mein "Weblog"](http://del.icio.us/chris_se/servertipps) [[RSS](http://del.icio.us/rss/chris_se/servertipps)]