Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dynamiczne tworzenie xsl
Forum PHP.pl > Forum > XML, AJAX
freakman69
Witam, męczę się już od dłuższego czasu i przeczytałem połowę internetu z google pod ręką i nie mogę znaleźć rozwiązania. Problem mój polega na tym że muszę utworzyć dynamicznie coś na stronie, ale jeszcze bez konkretów. mam plik xml, dtd, xsl i razem wyświetlają to co powinny, ale jak robię sobie htmla, który powinien to wyświetlić to kicha nic nie pokazuje, żadnego nawet błędu i nie wiem gdzie szukać. do konkretów:

XML:
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <?xml-stylesheet href="rozklad.xsl" type="text/xsl" ?>
  3. <!DOCTYPE rozklad SYSTEM "rozklad.dtd">
  4.  
  5. <rozklad>
  6.      <kurs nr = "168">
  7.            <przystanki>
  8.                  <przystanek>
  9.                        <nazwa>Trzymiasta</nazwa>
  10.                        <przyjazd></przyjazd>
  11.                        <odjazd>07:10</odjazd>
  12.                  </przystanek>
  13.                  <przystanek>
  14.                        <nazwa>Warszawa</nazwa>
  15.                        <przyjazd>07:13</przyjazd>
  16.                        <odjazd>07:13</odjazd>
  17.                  </przystanek>
  18.                  <przystanek>
  19.                        <nazwa>Wilno</nazwa>
  20.                        <przyjazd>07:16</przyjazd>
  21.                        <odjazd></odjazd>
  22.                  </przystanek>
  23.      
  24.  
  25.            <rodzaj>
  26.                  <typ>F</typ>
  27.                  <typ>E</typ>
  28.                  <typ>k</typ>
  29.            </rodzaj>
  30.      </kurs>
  31.  
  32.      <kurs nr = "23">
  33.            <przystanki>
  34.                  <przystanek>
  35.                        <nazwa>Wśród mieście</nazwa>
  36.                        <przyjazd></przyjazd>
  37.                        <odjazd>06:20</odjazd>
  38.                  </przystanek>
  39.                  <przystanek>
  40.                        <nazwa>Dolne miasto</nazwa>
  41.                        <przyjazd>06:25</przyjazd>
  42.                        <odjazd>06:25</odjazd>
  43.                  </przystanek>
  44.                        <przystanek>
  45.                        <nazwa>Dolne miasto</nazwa>
  46.                        <przyjazd>06:45</przyjazd>
  47.                        <odjazd></odjazd>
  48.                  </przystanek>
  49.            </przystanki>
  50.  
  51.            <rodzaj>
  52.                  <typ>F</typ>
  53.                  <typ>E</typ>
  54.                  <typ>k</typ>
  55.            </rodzaj>
  56.      </kurs>
  57.  
  58. </rozklad>


DTD:

  1. <!ELEMENT rozklad (kurs+)>
  2. <!ELEMENT kurs (przystanki+,rodzaj+)>
  3. <!ATTLIST kurs nr CDATA #REQUIRED>
  4. <!ELEMENT przystanki (przystanek+)>
  5. <!ELEMENT przystanek (nzawa|przyjazd|odjazd)*>
  6. <!ATTLIST przystanek przez CDATA #IMPLIED>
  7. <!ELEMENT nazwa (#PCDATA)>
  8. <!ELEMENT przyjazd (#PCDATA)>
  9. <!ELEMENT odjazd (#PCDATA)>
  10. <!ELEMENT rodzaj (typ+)>
  11. <!ELEMENT typ (#PCDATA)>


XSL:
  1. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  2.  
  3.      <xsl:template match="/">
  4.            <html>
  5.                  <body>
  6.                        <xsl:call-template name="rozklad">
  7.                              <xsl:with-param name="plik" select="."/>
  8.                        </xsl:call-template>
  9.                  </body>
  10.            </html>
  11.      </xsl:template>
  12.      
  13.      <xsl:template name="rozklad">
  14.            
  15.            <xsl:param name="plik"/>
  16.            
  17.            <xsl:for-each select="$plik/rozklad/kurs">
  18.                  <xsl:value-of select="@nr"/>
  19.            </xsl:for-each>
  20.            
  21.      </xsl:template>
  22.      
  23.      
  24.      
  25. </xsl:stylesheet>


i jak oglądam xml'a to wypisuje mi 16823, czyli tak jak powinno (kurs 168 i 23)

ale za pomocą html kicha, nic i oto html:

  1. <link href="rozklad.css" rel="Stylesheet" type="text/css" />
  2.  
  3. var xml, xsl, xsltmp;
  4.  
  5. function init(){
  6.  
  7. xml = new ActiveXObject('MSXML2.DOMDocument.4.0');
  8. xml.async = false;
  9. xml.load('rozklad.xml');
  10.  
  11. xsl=new ActiveXObject('MSXML2.FreeThreadedDOMDocument.4.0');
  12. xsl.async = false;
  13. xsl.load('rozklad.xsl');
  14. xsltmp = new ActiveXObject("Msxml2.XSLTemplate.4.0");
  15. xsltmp.stylesheet = xsl;
  16.  
  17. show('');
  18.  
  19. }
  20.  
  21.  
  22.  
  23.  
  24. function show(obj){
  25.  
  26. var xslProc = xsltmp.createProcessor();
  27. xslProc.input = xml;
  28. xslProc.addParameter("cos",obj,"");
  29. xslProc.transform();
  30. document.getElementById('innerBody').innerHTML = xslProc.output;
  31.  
  32.  
  33. }
  34. </script>
  35.  
  36. </head>
  37.  
  38. <body onload="init();">
  39. <div id="innerBody"></div>
  40. </body>
  41. </html>
ayeo
kurs_nr zamiast kurs nr...
freakman69
ale nr jest atrybutem elementu kurs, sprawdzałem validatorem i wszystko jest ok, myślę że coś jest nie tak albo z xsl albo i html
ayeo
sorry mój błąd winksmiley.jpg
teutates
Twoj problem nie lezy w technice lecz w zrozumieniu konceptu. Zamiast tworzyc dynamicznie xsl... tworz xmla.
Powiedzmy ze masz glowne drzewo:
  1. <main>
  2. </main>

Chcialbys aby podczes, gdy na srone wchodzi niezalogowany uzytkownik pokazywalo sie logowanie a podczas gdy wchodzi juz uwierzytelniony user - info o nim. Zalozmy wiec ze masz 2 dzieci drzewa main:
  1. <login></login>


oraz

  1. <user></user>


Metodologia wyglada nastepujaco:
Jesli PHPem okreslisz ze user jest autoryzowany podpinasz do drzewa main galaz <user></user> jesli nie jest, podpinasz inna galaz. W ten sposob nie musisz martwic sie o xsl, ktory z zalozenia jest tylko szablonem do okreslania jak xml ma zostac sparsowany przez przegloadarke. Przyklad jest oczywiscie zupelnie abstrakcyjny, jadnak dzilac swojego xsl na odpowiednie pliki, mozna naprawde przyspieszyc wyswietlanie stron oraz zmniejszyc obciazenie lacza.

Pozdrawiam
freakman69
może się źle wyraziłem, chodzi mi o to żeby później dodać inputa i za pomoca funkcji show przekazać jako parametr do xsl'a i żeby mi wyświetlił np, przystanki o takiej nazwy, ale z tym myślę, że sobie poradzę, ale na razie chodzi mi o to żeby wyświetlił mi wszystko normalnie tak jak otwieram w przeglądarce plik xml, to to powinno mi się wyświetlić w bloku div, niestety tak sie nie dzieje i nie wiem jak sobie z tym poradzić. A do dyspozycji mam tylko html, xml, dtd, xsl, javascript. Nie php, niestety.
Piotrek_90
a może by tak XMLHttpRequest();
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.