2009-05-14 14 views
4

Ich bin neu in XML/XSL. Ich möchte eine Var in einer Regelzeichenfolge übergeben können und die richtigen Daten zurückgeben.Übergeben von Variablen an XSLT

Im Moment habe ich dieses PHP haben:

<?php 
$params = array('id' => $_GET['id']); 

$xslDoc = new DOMDocument(); 
$xslDoc->load("test.xsl"); 

$xmlDoc = new DOMDocument(); 
$xmlDoc->load("test.xml"); 

$xsltProcessor = new XSLTProcessor(); 
$xsltProcessor->registerPHPFunctions(); 
$xsltProcessor->importStyleSheet($xslDoc); 

foreach ($params as $key => $val) 
    $xsltProcessor->setParameter('', $key, $val); 

echo $xsltProcessor->transformToXML($xmlDoc); 
?> 

Meine XML-Datei wie folgt aussieht:

<Profiles> 
    <Profile> 
    <id>1</id> 
    <name>john doe</name> 
    <dob>188677800</dob> 
    </Profile> 
    <Profile> 
    <id>2</id> 
    <name>mark antony</name> 
    <dob>79900200</dob> 
    </Profile> 
    <Profile> 
    <id>3</id> 
    <name>neo anderson</name> 
    <dob>240431400</dob> 
    </Profile> 
    <Profile> 
    <id>4</id> 
    <name>mark twain</name> 
    <dob>340431400</dob> 
    </Profile> 
    <Profile> 
    <id>5</id> 
    <name>frank hardy</name> 
    <dob>390431400</dob> 
    </Profile> 
</Profiles> 

Und mein xsl sieht wie folgt aus

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

    <xsl:param name="id" /> 

    <xsl:template match="*"> 
    <html><body> 
    <h2>Profile</h2> 
    <table cellspacing="1" cellpadding="5" border="1"> 
     <caption>User Profiles</caption> 
     <tr><th>ID</th><th>Name</th><th>Date of Birth</th></tr> 

     <xsl:for-each select="/Profiles/Profile[id='$id']"> 
     <tr> 
      <td><xsl:value-of select="id"/></td> 
      <td><xsl:value-of select="php:function('ucwords', string(name))"/></td> 
      <td><xsl:value-of select="php:function('date', 'jS M, Y', number(dob))"/></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body></html> 
    </xsl:template> 
</xsl:stylesheet> 

Wenn ich den Test URL wie folgt:

http://foo.com/sanbox/index.php?id=2

ich nur bekommen:

 
Profile 
User Profiles ID Name Date of Birth. 
+0

Die 'XSLTProcessor :: registerPHPFunctions()' ist schlecht dokumentiert ... Siehe http://en.wikibooks.org/wiki/PHP_Programming/XSL/registerPHPFunctions –

Antwort

3

im XPath-Ausdruck sollte keinen qoutes um die Variablennamen $ id nicht so soll es lesen:

<xsl:for-each select="/Profiles/Profile[id=$id]"> 

Auch Sie <xsl:value-of select="$id"/> setzen könnten in dem Dokument, um sicherzustellen, dass der Wert weitergegeben wird.

1

Hallo, ich bin auch neue xsl/xml zur Umsetzung, aber ich spielte mit Ihrem Code für ein wenig, konnte ich es nicht funktioniert, aber auch wenn Sie

<xsl:for-each select="/Profiles/Profile[id='$id']"> 

zu

ändern
<xsl:for-each select="/Profiles/Profile[id='2']"> 

Sie erhalten immer noch einen ekligen Fehler, obwohl es die richtigen Informationen holt. Wenn Sie irgendein "" oder sogar das "" mit etwas außer numerischem entfernen, geben Sie mehr Fehler. Ich habe einen anderen Weg gefunden, dies zu tun, obwohl ich keine Zeit hatte, es zu testen. Client Side XSLT

Ich habe das gleiche Problem wie Sie und würde wirklich gerne dieses Problem gelöst sehen.

Warning: XSLTProcessor :: transformToXml() [xsltprocessor.transformtoxml]: xmlXPathCompOpEval: function Funktion zu undefinierten prefix PHP in E gebunden: \ xampplite \ htdocs \ XSL \ index.php auf der Leitung 17

Warning: XSLTProcessor :: transformToXml() [xsltprocessor.transformtoxml]: xmlXPathCompiledEval: 1 auf dem Stapel verbliebene Objekte. in E: \ xampplite \ htdocs \ XSL \ index.php auf der Leitung 17

Warning: XSLTProcessor :: transformToXml() [xsltprocessor.transformtoxml]: xmlXPathCompOpEval: function Funktion zu undefinierten prefix PHP in E gebunden: \ xampplite \ Htdocs \ XSL \ index.php in Zeile

Warnung: XSLTProcessor :: transformToXml() [xsltprocessor.transformtoxml]: xmlXPathCompiledEval: 2 Objekte auf dem Stapel übrig. in E: \ xampplite \ htdocs \ XSL \ index.php on line 17

Profil

Benutzerprofile ID Name Geburtsdatum 2 mark antony 79900200

7

Der Fehler ist, weil Sie enthalten haben die korrekter Namespace.

In Ihrem xsl: Stylesheet-Deklaration enthalten xmlns: php = "http://php.net/xsl"

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:php="http://php.net/xsl" 
> 
+0

Kleines Leben sicherer dieser war, danke =) – MackieeE

+0

Der 'XSLTProcessor: : registerPHPFunctions() 'ist schlecht dokumentiert ... Siehe http://de.wikibooks.org/wiki/PH P_Programming/XSL/registerPHPFunktionen für weitere Informationen. –

0

Es gibt ein paar Probleme hier stoppen sie von der Arbeit, einige bereits erwähnt ..

Der Namensraum, wie oben erwähnt:

<stylesheet xmlns:php="http://php.net/xsl" 

Die for-each ... ich neige dazu verwenden:

<xsl:template match="/"> 

dann

<xsl:for-each select="Profiles/Profile[id=$id]"> 

Auch war die Zitate nicht korrekt ist, wie oben beschrieben, ist die ID nicht brauchen die ''

Mit diesen drei Änderungen es funktioniert ....

Verwandte Themen