Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: XSLT a zmienne
Forum PHP.pl > Forum > XML, AJAX > XML
nightmark
Witam.
Czy istnieje jakaz mozliwosc zastosowania klasycznych zmiennych w arkuszach XSLT.
Chodzi mi o mozliwosc zwiekszenia zmiennej przy przechodzeniu przez kolejny wezel.
Wiem ze w xslt nie istnieja zmienne w pelnym slowa tego znaczeniu ale moze da sie to zrobic w jakis inny sposob? Chodzi o to ze aby przy przejsciu przez np:

Kod:
<?xml version="1.0" encoding="iso-8859-2" ?>
- <document>
- <subject name="Jezyk angielski" internet_only="0" exam="1">
<lang_group name="1" level="B" />
<meeting date="2005-02-21" time="08:30 - 10:00" room="9K" teachers="mgr Aleksandra K" day="poniedzialek" />
<meeting date="2005-02-28" time="08:30 - 10:00" room="9K" teachers="mgr Aleksandra K" day="poniedzialek" />
<meeting date="2005-03-07" time="08:30 - 10:00" room="9K" teachers="mgr Aleksandra K" day="poniedzialek" />
<meeting date="2005-03-14" time="08:30 - 10:00" room="9K" teachers="mgr Aleksandra K" day="poniedzialek" />
<meeting date="2005-03-21" time="08:30 - 10:00" room="9K" teachers="mgr Aleksandra K" day="poniedzialek" />
<meeting date="2005-04-04" time="08:30 - 10:00" room="9K" teachers="mgr Aleksandra K" day="poniedzialek" />
...........
..........
.........itd

kawalek takiego kodu byl bym w stanie stworzyc petle i zwiekszyc jakas zmienna o 1, aby wiedzec czy w dokumencie przez mnie przetwarzanym "meeting date" jest mniejsze od daty dzisiejszej.

Date dzisiejsza pobieram z php wiec ja mam. Konwetruje date na liczbe, tworze petle, ktora po kolei sprawdza czy data ta juz minela i gdy minela, chce zwiekszac jakas wartosc o 1, zeby moc sprawdzic czy minely juz wszystkie daty we wszystkich przedmiotach i wyswietlic odpowiedni komunikat.
Moza sa jakies rozszerzenia ktore sa w stanie to zalatwic?
Zgory dzieki za pomoc.
Pozdrawiam
matid
  1. <xsl:variable name="liczba" select="1" />
  2. <xsl:variable name="liczba" select="$liczba+1" />

A co do pętli to jest:
  1. <xsl:for-each select="węzeł"></xsl:for-each>
nightmark
Tak tyle ze to wlasnie bedzie traktowane jako stala a nie zmienna krora moge zwiekszac.
Chodzi mi bardziej co cos w stylu na czym moge wykonac np i++ .
Zwiekszenie zmiennej o 1 badz jakas tam wartosc.
matid
Cytat
The only way in which a variable can be changed is by declaring it inside a for-each loop, in which case its value will be updated for every iteration.
nightmark
po zrobieniu tego jak mowisz wyskakuje:
conflicting variable bindings 'liczba'
matid
Nie wiem do końca, jak zmieniasz te czasy na timestamp, ale udało mi się wymyślić tylko takie coś:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
  3. <document>
  4.    <lang>
  5.        <meeting time="1123271502" />
  6.        <meeting time="1123272502" />
  7.        <meeting time="1123273502" />
  8.    </lang>
  9.    <lang>
  10.        <meeting time="1123274502" />
  11.        <meeting time="1123275502" />
  12.        <meeting time="1123276502" />
  13.        <meeting time="1123277502" />
  14.    </lang>
  15. </document>

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3. <xsl:template match="/">
  4.    <html>
  5.    <body>
  6.        <xsl:variable name="now">1123275502</xsl:variable>
  7.        <xsl:variable name="pozostalo" select="count(/document/lang[meeting/@time>$now])" />
  8.    <xsl:if test="$pozostalo = 0">
  9.        Mineły wszystkie daty we wszystkich przedmiotach!
  10.    </xsl:if>
  11.    </body>
  12.    </html>
  13. </xsl:template>
  14. </xsl:stylesheet>

Popracujesz trochę nad tym i powinno być ok.

A co to tych zmiennych, to przepraszam, tego rzeczywiście się tak nie da zrobić smile.gif
nightmark
Konwertuje date na liczbe w ten sposob:

<xsl:variable name="d_data">
<xsl:value-of select="translate($dzisiejsza_data,'-','')"/> <!-- konwertuje date na liczbe -->
</xsl:variable>

Czy istnieje mozliwosc przekonwetowania tego w locie zgodnie ze schametem ktory proponujesz?

<xsl:variable name="pozostalo" select="count(/document/subject[meeting/@date > $d_data])" />
<xsl:if test="$pozostalo = 0">
<p> Minely wszystkie daty we wszystkich przedmiotach!</p>
</xsl:if>

poniewaz data pobiarana wczesniej z bazy danych jest w formacie z kreskami i tak wlasnie wystepuje w dokumencie xml ktory przerabiam za pomoca tego arkusza



wlasnie troche przerobilem i zdaje sie dzialac w ten sposob:

Kod
<xsl:variable name="d_data">
       
      <xsl:value-of select="translate($dzisiejsza_data,'-','')"/> <!-- konwertuje date na liczbe -->
</xsl:variable>



<xsl:variable name="pozostalo" select="count(/document/subject[translate(meeting/@date,'-','') > $d_data])" />
<xsl:if test="$pozostalo = 0">
<p> Minely wszystkie daty we wszystkich przedmiotach!</p>
</xsl:if>
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.