![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 Pomógł: 0 Dołączył: 24.06.2007 Ostrzeżenie: (0%) ![]() ![]() |
Piszę skrypt do rozwiązywania testów. Mam plik xml z pytaniami, xsl do formatowania i chcę poprzez php wyświetlić strona po stronie zawartość pliku sformatowanego pliku xml
Plik xml składa się ze znaczników <page> które odpowiadają za kolejne strony. Niestety nie wiem jak wyrzucić(przeparsować) sformatowaną tylko jedną stronę(jeden tag <page>). Wiem jak to zrobić przy pomocy xpath ale nie wiem jak napisać to w php. Używam XSLTransform() ale wyrzuca mi wszystko naraz. A chce mieć strona po stronie. W skrócie: mam meta.xml Kod <!xml ....!> <course> <page>...</page> <page>...</page> <page>...</page> . . . <page>...</page> </course> i formatowanie tego pliku przy pomocy style.xsl Cel: zrobić funkcje LearningUnit::function Page($number) w PHP aby po wpisaniu konkretnej strony($number) wypisywała się tylkoo jedna ładnie sformatowa strona przy pomocy style.xsl Listing: plik meta.xml Kod <?xml version="1.0" encoding="iso-8859-2"?> <?xml-stylesheet type="text/xsl" href="style.xsl"?> <course xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../meta_data.xsd"> <name>Prawo jazdy kategoria B</name> <description>Pytania egzaminacyjne z teorii na prawo jazdy kategorii B</description> <type>test</type> <!-- test course quiz --> <time>30</time> <page> <resource type="jpg" src="p1.jpg"/> <question type="check"> <!-- radio select check text--> <label>Zatrzymanie pojazdu na jezdni za tym znakiem:</label> <answer>jest dozwolone nie dłużej niż 1 minutę,</answer> <answer correct="yes">spowoduje jego usunięcie z drogi na koszt właściciela,</answer> <answer>jest dozwolone, bez opuszczania go przez kierującego.</answer> </question> </page> <page> <resource type="jpg" src="p2.jpg"/> <question type="check"> <!-- radio select check text--> <label>W tej sytuacji zabrania się:</label> <answer correct="yes">zatrzymania pojazdu na jezdni,</answer> <answer correct="yes">postoju pojazdu na jezdni,</answer> <answer correct="yes">zatrzymania pojazdu na poboczu.</answer> </question> </page> . . . <page> <resource type="jpg" src="p3.jpg"/> <question type="check"> <!-- radio select check text--> <label>Sygnał ten oznacza:</label> <answer>zezwolenie na skręcenie w lewo, po uprzednim zatrzymaniu się przed sygnalizatorem,</answer> <answer>zezwolenie na zawrócenie,</answer> <answer correct="yes">że podczas skręcania w lewo nie występuje kolizja z innymi uczestnikami ruchu.</answer> </question> </page> </course> XSL plik style.xsl Kod <?xml version="1.0" encoding="ISO-8859-2"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2><xsl:value-of select="course/name" /></h2> <h3><xsl:value-of select="course/description" /></h3> <h3><xsl:value-of select="course/type" /></h3> <xsl:for-each select="course/page"> <xsl:for-each select="resource"> <xsl:if test="@type='jpg'"> <xsl:variable name="varImgSrc" select="@src" /> <img src="{$varImgSrc}" /> <br /> </xsl:if> </xsl:for-each> <xsl:for-each select="question"> <xsl:if test="@type='check'"> <xsl:value-of select="label" /> <br /> <xsl:for-each select="answer"> <input type="checkbox" name="answer" value="cat" /> <xsl:value-of select="." /> <br /> </xsl:for-each> </xsl:if> <xsl:if test="@type='radio'"> <xsl:value-of select="label" /> <br /> <xsl:for-each select="answer"> <input type="radio" name="answer" value="cat" /> <xsl:value-of select="." /> <br /> </xsl:for-each> </xsl:if> <xsl:if test="@type='text'"> <xsl:value-of select="label" /> <br /> <xsl:for-each select="answer"> <input type="text" name="answer" value="cat" /> <xsl:value-of select="." /> <br /> </xsl:for-each> </xsl:if> </xsl:for-each> </xsl:for-each> <br /> <input type="button" id="next" value="next" /> <input type="button" id="previous" value="previous" /> <br /> </body> </html> </xsl:template> </xsl:stylesheet> a moja klasa transformująca wygląda tak: Kod <?php class LearningUnit { private $doc; private $xsl; private $page; function LearningUnit($xml_filename,$xsl_filename) { $this->doc = new DOMDocument(); $this->xsl = new XSLTProcessor(); $this->doc->load($xsl_filename); $this->xsl->importStyleSheet($this->doc); $this->doc->load($xml_filename); } function Start() { echo $this->xsl->transformToXML($this->doc); } function Page($number) { $this->page = $this->doc->getElementsByTagName("page"); echo $this->page->item(0)->nodeValue; $this->xsl->transformToXML($this->page); [i][b]<- tu jest błąd. Chce coś takiego aby wpisując numer strony($number) wyskakiwała mi pojedyńcza sformatowana strona używając jednego pliku xsl[/b][/i] // $this->resource = $this->page->getElementsByTagName("resource"); // echo $this->resource-> getAttribute('type'); } } try { $learningUnit = new LearningUnit("repository/DrivingLicence1_B/meta.xml","repository/DrivingLicence1_B/style.xsl"); } catch(Exception $e) { } //$learningUnit->Start(); $learningUnit->Page(1); ?> Macie jakiś pomysł na to? Moze inaczej do tego podejść? Oczywiście mogę stworzyć plik xsl dla każdej strony i przeparsować go xsl->transformToXML($this->doc); ale to syzyfowa praca. Czuje że napewno jest bardziej optymalne rozwiązanie. Tylko nie wiem gdzie się zaczepić. ok problem rozwiązany. Wystarczy poużywać znaczników <xsl:param> i w PHP xsl->setParameter(); polecam tutoriala http://www.tonymarston.net/php-mysql/xsl.html#a6a JUż po problemie. Rozwiązanie bardzo proste wystarczy użyc parametrów w xslt i przekazywać je z poziomu PHP |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 06:13 |