Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Automatycznie generowany szablon xslt (na podstawie pliku xml) - czy to się da zrobić ?
Forum PHP.pl > Forum > PHP
szagi3891
Moje pytanie jest takie.
Wyobraźmy sobie dane xml opisujące jak ma wyglądać strona. Następnie te dane poddaję transformacji za pomocą stałego szablonu xslt który mi generuje właściwy szablon tej konkretnej podstrony.

Wynikowy szablon (który został wygenerowany z danych xml) + dane konkretnej podstrony --> otrzymalibyśmy stronę na której nam zależy.

Teraz pytanie, jak stworzyć taki szablon xslt który na podstawie danych z pliku xml wygeneruje nowy szablon xslt ?


reasumując (chcę zrobić coś takiego) :

xml1 - dane opisujące budowę strony
xslt1 - szablon systemowy służący do generowania plików xslt konkretnych podstron
xslt2 - szablon konkretnej podstrony
xml2 - dane które mają zostać osadzone na konkretnej podstronie

xml1 + xslt1 ----> xslt2
xml2 + xslt2 ----> nasz długo oczekiwany dokument html sformatowany ze wszystkimi możliwymi standardami smile.gif

Czy ma ktoś pomysł jak napisać taki szablon xslt1 ?
Problem sprowadza się zasadniczo do tego że nie wiem jak osadzić znaczniki w przestrzeni nazw xsl:cos w nowym wynikowym dokumencie.
erix
Cytat
Teraz pytanie, jak stworzyć taki szablon xslt który na podstawie danych z pliku xml wygeneruje nowy szablon xslt ?

Yyyy, a po co tak?

Cytat
xslt1 - szablon systemowy służący do generowania plików xslt konkretnych podstron

Z tego, co pamiętam, to przecież można dołączać szablony do siebie.
szagi3891
Po to :

xml_dane (strony)
xml_wyglad (wygląd)

xml_wygląd + xslt_0 -> xslt_wyglad
xslt_wyglad + xml_dane -> gotowa strona

Można by to przyrównać do własnego systemu szablonów ściśle opartego na xslt i mocno z niego korzystających . Na podobnej zasadzie transformuje swoje szablony smarty na postać skompilowaną skryptów php które są potem łączone z danymi konkretnej podstrony. Zasada jest identyczna tylko że ja chcę mocno z xslt korzystać.

Idąc tym tokiem można by stworzyć coś na kształt kontrolek serwerowych z asp. Arkusz xslt_0 właśnie może odpowiadać za opis tego jak konkretna kontrolka ma zostać przetransformowana na kod szablonu xslt.
erix
Cytat
xml_dane (strony)
xml_wyglad (wygląd)

xml_wygląd + xslt_0 -> xslt_wyglad
xslt_wyglad + xml_dane -> gotowa strona

Może zrób jakimś pseudokodem, bo trochę chaotycznie przedstawiłeś. Jak masz header/footer/sidebar, to przeciez możesz zainclude'ować inny, nie?

http://www.xml.com/pub/a/2000/11/01/xslt/index.html

IMHO cały problem rozwiązany.
szagi3891
O Boże. Chyba dam Ci zaraz jakiś "antypomógł" smile.gif Jeśli nie znasz odpowiedzi to proszę nie śmieć mi tematu.

Pytanie jest jednoznaczne : Automatycznie generowany szablon xslt (na podstawie pliku xml, pliku który opisuje jak on ma wyglądać) - czy to się da zrobić ?

Edit:

No dobrze, może jeszcze Cię tak z tym antypomógł tak nie będę karał. Chcesz kodu, ok.

Załóżmy ża mamy dane opisujące tabelę (w pliku xml z danymi) :
  1. <planety>
  2. <planeta>
  3. <nazwa>zmienia</nazwa>
  4. <od_slonca>3</od_slonca>
  5. </planeta>
  6.  
  7. <planeta>
  8. <nazwa>mars</mars>
  9. <od_slonca>2(chyba)</od_slonca>
  10. </planeta>
  11. </planety>


Tworzę plik xml który opisuje (określa) jak konkretne dane mają zostać wyświetlone na stronie.
  1. <table select="planety/planeta"> <!--select określa wiersze z danymi -->
  2. <column select="nazwa"> <!-- określa kolumnę z wiersza -->
  3. <name>nazwa planety</name>
  4. </column>
  5.  
  6. <column select="od_slonca">
  7. <name>kolejna od slonca</name>
  8. </column>
  9. </table>


No i teraz zostaje zadanie przetransformowania pliku xml zawierającego wygląd docelowej strony na odpowiedni szablon xslt który w połączeniu z danymi o planetach wyświetli odpowiednią tabelkę.

Napotkałem problem z napisaniem takiego szablonu ponieważ nie wiem jak w wynikowym dokumencie umieścić znaczniki typu : <xsl:cos> tak aby nie były przez obecną transformację interpretowane.
Czy to jest jaśniejszy opis ?
erix
Cytat
O Boże. Chyba dam Ci zaraz jakiś "antypomógł"

Bogu? tongue.gif

Cytat
Chyba dam Ci zaraz jakiś "antypomógł" Jeśli nie znasz odpowiedzi to proszę nie śmieć mi tematu.

Jakie pytanie, taka odpowiedź, wyrażaj się jasno, będą jasne odpowiedzi.

Cytat
Tworzę plik xml który opisuje (określa) jak konkretne dane mają zostać wyświetlone na stronie.

Ten plik musisz dołączyć do głównego XSLT. Potem, przy template-match po prostu wyciągasz atrybuty stosując łączenie stringów i pobranie wartości kolumn wybranych w dołączonym pliku. (operuj na zapytaniu w XPath)
szagi3891
Dobrze Bogu, a teraz zróbmy eksperyment. Puść sznur biggrin.gif

Cytat(erix @ 14.08.2009, 16:11:47 ) *
Ten plik musisz dołączyć do głównego XSLT. Potem, przy template-match po prostu wyciągasz atrybuty stosując łączenie stringów i pobranie wartości kolumn wybranych w dołączonym pliku. (operuj na zapytaniu w XPath)


A tak serio to wyjaśnij proszę swoją odpowiedź. Jasna odpowiedź to i może będzie "pomógł" smile.gif
erix
Cytat
Jasna odpowiedź to i może będzie "pomógł"

I tak z tych punktów nic nie ma. ;d

Cytat
A tak serio to wyjaśnij proszę swoją odpowiedź.

No przecież masz w transformacjach XSL pętle:

  1. <xsl:for-each select="catalog/cd">
  2. <tr>
  3. <td><xsl:value-of select="title" /></td>
  4. <td><xsl:value-of select="artist" /></td>
  5. </tr>
  6. </xsl:for-each>


Przelatujesz <column /> i to, co wyciąga xsl:value-of pakujesz jako pobieranie wartości. Po prostu pętla w pętli. ;]
szagi3891
Uffff, znalazłem.
Chodziło mi o taką konstrukcję :
  1. <xsl:text disable-output-escaping="yes">&lt;xsl:value-of match="."/&gt;</xsl:text>


Właśnie ten przykład który podajesz będzie wynikiem transformacji danych :

  1. <table select="planety/planeta">
  2. <column select="nazwa">
  3. <name>nazwa planety</name>
  4. </column>
  5.  
  6. <column select="od_slonca">
  7. <name>kolejna od slonca</name>
  8. </column>
  9. </table>


Za pomocą szablonu XSLT_0, który trzeba dopiero napisać.

Wynikiem tej transformacji będzie szablon :

  1. <xsl:for-each select="catalog/cd">
  2. <tr>
  3. <td><xsl:value-of select="title" /></td>
  4. <td><xsl:value-of select="artist" /></td>
  5. </tr>
  6. </xsl:for-each>


No. Taka jest właśnie moja idea :]
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.