• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

XML/XSL problem

Object Storage Arubacloud
0 głosów
226 wizyt
pytanie zadane 29 stycznia 2023 w Inne języki przez benny13 Obywatel (1,150 p.)
otagowane ponownie 30 stycznia 2023 przez benny13
Cześć, szukam osoby która zechciałaby pomóc w zadaniu z XML, konkretnie chodzi mi o to, aby każdy wiersz tabeli miał inny kolor tła, które musi zależeć od wartości atrybutu "type". Jak to napisać w XSL?

3 odpowiedzi

+1 głos
odpowiedź 29 stycznia 2023 przez VBService Ekspert (253,100 p.)
wybrane 30 stycznia 2023 przez benny13
 
Najlepsza

Proponuję inny zapis

<xsl:for-each select="bestMovies/movie"> 
  <tr style="background-color: {@type}">
    <td><xsl:value-of select="title"/></td> 
    <td><xsl:value-of select="year"/></td> 
    <td><xsl:value-of select="filmDirector"/></td> 
    <td><xsl:value-of select="country"/></td> 
    <td><xsl:value-of select="filmweb_rating"/></td> 
	<td><img src="{photo}" alt="brak zdjęcia" width="100px" height="100px"/></td> 
  </tr> 
</xsl:for-each> 

lub

<xsl:for-each select="bestMovies/movie"> 
  <tr class="{@type}">
    <td><xsl:value-of select="title"/></td> 
    <td><xsl:value-of select="year"/></td> 
    <td><xsl:value-of select="filmDirector"/></td> 
    <td><xsl:value-of select="country"/></td> 
    <td><xsl:value-of select="filmweb_rating"/></td> 
	<td><img src="{photo}" alt="brak zdjęcia" width="100px" height="100px"/></td> 
  </tr> 
</xsl:for-each> 

 

cały proponowany zapis

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <html>
      <body>
        <table border="1">
          <caption><h2>The best movies</h2></caption>
          <thead> 
            <tr style="background-color: green"> 
              <th>Title</th> 
              <th>Year</th>
              <th>Director</th> 
              <th>Country</th> 
	          <th>Rating</th> 
              <th>Photo</th> 
            </tr>
          </thead> 
          
          <tbody>  
            <xsl:for-each select="bestMovies/movie"> 
              <tr style="background-color: {@type}">
                <td><xsl:value-of select="title"/></td> 
                <td><xsl:value-of select="year"/></td> 
                <td><xsl:value-of select="filmDirector"/></td> 
                <td><xsl:value-of select="country"/></td> 
                <td><xsl:value-of select="filmweb_rating"/></td> 
		        <td><img src="{photo}" alt="brak zdjecia" width="100px" height="100px"/></td> 
              </tr> 
            </xsl:for-each>
          </tbody> 
        </table>
         
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

 

BTW, proponuje taki zapis bez tych spacji (odstęp uzyskasz z poziomu css, np. za pomocą: padding-a)

<movie type="green" genre="drama" time="142min">
  <title>The Shawshank Redemption</title>
  <year>1994</year>
  <filmDirector>Frank Darabont</filmDirector>
  <country>USA</country>
  <filmweb_rating>8.76</filmweb_rating>
  <photo>https://upload.wikimedia.org/wikipedia/en/8/81/ShawshankRedemptionMoviePoster.jpg</photo>
</movie>

do testowania np. on-line

1
komentarz 29 stycznia 2023 przez benny13 Obywatel (1,150 p.)
Bardzo dziękuję!!!!
komentarz 29 stycznia 2023 przez benny13 Obywatel (1,150 p.)
edycja 29 stycznia 2023 przez benny13

Wie Pan może czemu po otwarciu pliku XML w przeglądarce wyskakuje coś takiego, zamiast tabeli wraz z kolorami, obrazkami itd, tak jak na stronie XSLT TryitEditor? Próbowałem zapisać kod w innym programie, aniżeli Visual Studio Code, ale niestety nie pomogło :( Co może być przyczyną tego? Kod XML: https://pastebin.com/huN1dcFh

Kod XSL: https://pastebin.com/t0mEp1mC

Oba pliki są w tym samym folderze.

1
komentarz 30 stycznia 2023 przez VBService Ekspert (253,100 p.)
edycja 30 stycznia 2023 przez VBService

W sumie nie sprawdzałem, ale rzeczywiście ...

XSL not working in Google Chrome

na ms edge-u działa angel

na "chromie" Mi zadziałało, gdy uruchomiłem z ...

komentarz 30 stycznia 2023 przez benny13 Obywatel (1,150 p.)
Dziękuję, spróbuję na Edge odpalić :D
+1 głos
odpowiedź 29 stycznia 2023 przez Wiciorny Ekspert (269,710 p.)

Możesz użyć pętli "for-each" i warunku "choose-when" w XSL aby ustawić kolor tła dla każdego wiersza tabeli na podstawie wartości atrybutu "type". W taki sposób: 

<xsl:template match="row">
  <tr>
    <xsl:for-each select="cell">
      <td>
        <xsl:attribute name="style">
          <xsl:choose>
            <xsl:when test="@type='A'">background-color: red;</xsl:when>
            <xsl:when test="@type='B'">background-color: green;</xsl:when>
            <xsl:when test="@type='C'">background-color: blue;</xsl:when>
            <xsl:otherwise>background-color: yellow;</xsl:otherwise>
          </xsl:choose>
        </xsl:attribute>
        <xsl:value-of select="." />
      </td>
    </xsl:for-each>
  </tr>
</xsl:template>

Co się tu dzieje? Na przykładzie :  dla każdej komórki (cell) w wierszu (row) ustawiany jest styl CSS "background-color" na podstawie wartości atrybutu "type".
Kiedy Type jest bezpośrednio XML-owy nie programowalny do końca to  w takim przypadku możesz użyć atrybutu "type" jako wartości wewnętrznej dla każdej komórki w wierszu i użyć pętli "for-each" i warunku "choose-when" w XSL. 

<xsl:template match="row">
  <tr>
    <xsl:for-each select="cell">
      <td>
        <xsl:attribute name="style">
          <xsl:choose>
            <xsl:when test="type='A'">background-color: red;</xsl:when>
            <xsl:when test="type='B'">background-color: green;</xsl:when>
            <xsl:when test="type='C'">background-color: blue;</xsl:when>
            <xsl:otherwise>background-color: yellow;</xsl:otherwise>
          </xsl:choose>
        </xsl:attribute>
        <xsl:value-of select="." />
      </td>
    </xsl:for-each>
  </tr>
</xsl:template>

 

komentarz 29 stycznia 2023 przez benny13 Obywatel (1,150 p.)
Oo bardzo Panu dziękuję za tak długą odpowiedź! :)
komentarz 29 stycznia 2023 przez benny13 Obywatel (1,150 p.)

Niestety wciąż mimo Pana pomocy coś nie działa u mnie :( Nie wiem jak użyć tego na moim dokumencie, w które miejsca wpisać dane instrukcje. Czy mógłby Pan zerknąć na kod?

XML: https://pastebin.com/cgRG2THz

XSL: https://pastebin.com/j7icV6Rs

+1 głos
odpowiedź 29 stycznia 2023 przez overcq Pasjonat (21,650 p.)

Można też tak:

<?xml version="1.0"?>
<table>
    <row type="a">1</row>
    <row type="b">2</row>
    <row>3</row>
</table>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="table">
        <table>
            <xsl:apply-templates/>
        </table>
    </xsl:template>
    <xsl:template match="row">
        <td class="c">
            <xsl:apply-templates/>
        </td>
    </xsl:template>
    <xsl:template match="row[@type='a']">
        <td class="a">
            <xsl:apply-templates/>
        </td>
    </xsl:template>
    <xsl:template match="row[@type='b']">
        <td class="b">
            <xsl:apply-templates/>
        </td>
    </xsl:template>
</xsl:stylesheet>

 

komentarz 29 stycznia 2023 przez benny13 Obywatel (1,150 p.)

Bardzo dziękuję, tylko u mnie jest inna struktura w XSL i nie wiem, jak to zapisać w moim programie, mógłby Pan zerknąć na kod?

XML: https://pastebin.com/cgRG2THz

XSL: https://pastebin.com/j7icV6Rs

1
komentarz 29 stycznia 2023 przez overcq Pasjonat (21,650 p.)

Błędem jest select="BestMovies/movie", gdy już jesteś w BestMovies. Wystarczy movie.

Możesz wejść na Discord?

komentarz 29 stycznia 2023 przez benny13 Obywatel (1,150 p.)
Dzięki, poprawię to :-) Niestety nie mam Discorda

Podobne pytania

0 głosów
1 odpowiedź 139 wizyt
pytanie zadane 19 listopada 2015 w Inne języki przez rafalmagician Obywatel (1,320 p.)
0 głosów
1 odpowiedź 485 wizyt
pytanie zadane 28 listopada 2018 w HTML i CSS przez KiaKaha Nowicjusz (120 p.)
0 głosów
1 odpowiedź 154 wizyt
pytanie zadane 4 lutego 2016 w Inne języki przez fleczer Nowicjusz (120 p.)

92,555 zapytań

141,404 odpowiedzi

319,559 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...