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>
<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>
<?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>
<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);
?>
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