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