PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : XML XSLT und php



shb
14-02-2010, 10:54
hi leute, ich hab ein problem mit dem o.g. ich lasse mittels php ein xml erstellen und nutzer dazu dann ja logischerweise

header("Content-Type: application/xhtml+xml;charset=UTF-8");

dann hab ich noch ein xsl file, welches auch mit hilfe von php erstellt wird
und nun versuche ich noch beide dokumente zusammen zuführen, wenn ich das mit
<?xml-stylesheet type="text/xsl" href="./sample.php"?>' im xml file angebe funktioniert auch so wie ich mir das vorstelle.
nun wollte ich das ganze aber ohne die o.g. angaben versuchen und dafür das ganze mit php-xslt verbinden, dann fehlt aber der ganze inhalt, der mit php erstellt wurden ist
das dritte file sieht so aus:

<?php
$xp = new XsltProcessor;

$xsl = new DOMDocument;
$xsl->load('sample.php');
$xp->importStylesheet($xsl);

$xml = new DOMDocument;
$xml->load('kalender.php');

$output = $xp->transformToXML($xml) or die('Transformation error!');

echo $output;
?>


cu SHB

msi
14-02-2010, 11:22
wenn du load("sample.php") machst wird auch nicht die ausgabe von
dem php programm geladen sondern das php programm.

du müsstest also sample.php aufrufen, die ausgabe in einer temp. datei speichern und diese dann laden.

undefined
14-02-2010, 12:25
Du kannst file_get_contents() mit einer »URL« verwenden.
Dann geht das ;)
z.B:


$xml = file_get_contents( "http://localhost/sample.php" );
...

Wobei deine Arbeitsweise unlogisch ist!!
Warum verwendest du nicht include und ziehst deine xml über eine Funktion mit $dom->importNode rein und hängst dann deine XML an den XSLT Prozessor an.
Das Beispiel lädt eine XML und hängt eine weitere XML an.


/**
* Suche Template und gebe den XML Dokumenten Inhalt zurueck.
* @section Base
* @short Open XML Template from content/?.xml Into str Stream.
* @param[in] \b $tpl Templatename without Extension. (STRING)
* @return VOID
*/
function importTemplate( $tpl, DomDocument $dom, DomElement $append )
{
$file = HJCMS_BASEDIR . "/content/" . $tpl . ".xml";
if ( is_readable( $file ) )
{
$xml = new DomDocument('1.0','utf8');
$xml->formatOutput = true;
$xml->load( $file );
$template = $xml->getElementsByTagName('div')->item(0);
if (!$template)
return;

$tpl = $dom->importNode( $template, true );
$append->appendChild( $tpl );
}
}

shb
18-02-2010, 19:56
da ich mich erst seit kurzen mit xml xslt befasse verstehe ich nicht warum das unlogisch ist, kannst du mich aufklären

danke

cu SHB

undefined
18-02-2010, 20:47
Weil du mit einer Funktion wesentlich Performanter arbeitest.
In deiner Variante machst du für eine Abfrage zwei HTTP anfragen an den Apache. Das macht pro Anfrage ca. 5 Sub Prozesse (Kindprozesse) je nach Einstellung im Apache aus ohne die Modul Prozesse an PHP mit gerechnet.
Wenn ich dein Admin währe hättest du ganz schnell ein E-Mail mit der Androhung deinen Account vorerst zu sperren ;)
http://httpd.apache.org/docs/2.0/mod/prefork.html

shb
20-02-2010, 09:03
ok, nun hab ich das xml dokument komplett mit dom document erstellen lassen und wenn ich das file aufrufe stellt er es mir auch genauso dar wie ich es mir vorstelle, wenn ich das file nun mit include hereinziehe wird einfach eine
1 an das dokument angehangen
das ist das file um den xml code zu erzeugen

<?php
header("Content-Type: text/xml;charset=UTF-8");
$xml = new DOMDocument("1.0","UTF-8");
$xml->formatOutput = true;

$kalender = $xml->createElement("kalender");
$xml->appendChild($kalender);

$monat = $xml->createElement("monat");
$kalender->appendChild($monat);

$person = $xml->createElement("person");
$monat->appendChild($person);

$name = $xml->createElement("name","Wolf");
$person->appendChild($name);


$termin = $xml->createElement("termin");
$person->appendChild($termin);

$datum = $xml->createElement("datum");
$termin->appendChild($datum);

print $xml->saveXML();
?>


der erzeugt code sieht dann entsprechend so aus

<?xml version="1.0" encoding="UTF-8"?>
<kalender>
<monat>
<person>
<name>Wolf</name>
<termin>
<datum/>
</termin>
</person>

</monat>
</kalender>

ich hab das include zum testen sehr gering gehalten

<?php
echo include("kal1.php");
?>

und dann sieht der erzeugte code so aus:

<?xml version="1.0" encoding="UTF-8"?>
<kalender>
<monat>
<person>
<name>Wolf</name>
<termin>
<datum/>
</termin>
</person>

</monat>
</kalender>
1

kann mir jemand sagen wo das problem liegt?

danke
cu SHB

undefined
20-02-2010, 15:56
In der include Datei nicht mit print ausgeben sondern in eine Variable Schreiben und die header() Definition kannst du weglassen die wird erst ganz am Ende benötigt.


$meinXML = $xml->saveXML();

shb
20-02-2010, 16:43
ja das print hab ich auch gerade gesehen, ich volldepp!

habs auch wie du geschrieben hast mit saveXML in einen string geschrieben
nun versuche ich in der anderen datei den string in loadXML einzulesen.


<?php

$xsl = new DOMDocument();
$xmla = new DOMDocument();
$proc = new XSLTProcessor();

$xsl->load("sample.php");
include("kal.php");
$xmla->loadXML($out);
$proc->importStylesheet($xsl);

echo $proc->transformToXML($xmla);

?>

aber er zeigt nur das xsl file ohne entsprechenden inhalt an, mir ist nicht ganz klar wo der fehler liegt, oder muss ich es dann mit $dom->importNode erst noch importieren?

cu SHB

undefined
22-02-2010, 15:15
Die PHP Dateien Includieren damit der PHP Parser diese auch Übersetzt.


// include sample.php wo die Variable $xslt vorhanden ist
include ( "sample.php" );
// include kal.php wo die Variable $out vorhanden ist
include("kal.php");

// lade $xslt
$xsl = new DOMDocument();
$xsl->loadXML( $xslt );

// lade XML Dom
$dom = new DOMDocument();
$dom->loadXML($out);

// erstelle XSLT prozessor
$proc = new XSLTProcessor();
// Importiere xslt
$proc->importStylesheet($xsl);


$html = $proc->transformToXML($dom);


echo $html;


Ich habe dir noch ein Paar Beispiele angehangen.

shb
22-02-2010, 19:11
so... ich bedanke mich erstmal, war mal wieder "Fehler 50" hab in dem mit php erstellten file einen tag vergessen. jetzt funzt erstmal alles
DANKE

cu SHB