Как отображать продукты в xsl-xml с помощью выбора и когда

#xml #xslt

#xml #xslt

Вопрос:

Проблема в том,:

Я не могу показать все продукты в xml, используя choose и when в for-each, и я не знаю почему

Я пробовал использовать if, но результат был тот же. Я попытался добавить еще один для каждого, но это не сработало.

в catalogo2.xsl:

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/catalogo">
    <html>
        <body>
            <table border="1" width="100%" height="100%">
                <th>Referencia</th><th>Nombre artículo</th><th>Descripción</th><th>Departamento</th><th>Categoría</th><th>Precio</th><th>Foto</th><th>Web</th>
                <xsl:for-each select="producto">
                <xsl:sort select="precio " data-type="number" order="descending"/>
                <xsl:choose>
                <xsl:when test="precio amp;<20 and precio amp;>0">
                    <tr bgcolor="blue">
                    <td>
                            <xsl:value-of select="referencia" /><br />
                        </td>
                        <td>
                            <xsl:value-of select="descripcion" /><br />
                        </td>
                        <td>
                            <xsl:value-of select="marca" /><br />
                        </td>
                        <td>
                            <a href="{web}"><img src="{foto_articulo}" width="180" height="200"/></a>
                        </td>
                        <td>
                            <xsl:value-of select="precio" /><br />
                        </td>
                    </tr>
                </xsl:when>
                <xsl:when test="precio amp;<60 and precio amp;>21">
                    <tr bgcolor="yellow">
                    <td>
                            <xsl:value-of select="referencia" /><br />
                        </td>
                        <td>
                            <xsl:value-of select="descripcion" /><br />
                        </td>
                        <td>
                            <xsl:value-of select="marca" /><br />
                        </td>
                        <td>
                            <a href="{web}"><img src="{foto_articulo}" width="180" height="200"/></a>
                        </td>
                        <td>
                            <xsl:value-of select="precio" /><br />
                        </td>
                    </tr>
                </xsl:when>
<xsl:when test="precio amp;>60">
                    <tr bgcolor="purple">
                    <td>
                            <xsl:value-of select="referencia" /><br />
                        </td>
                        <td>
                            <xsl:value-of select="descripcion" /><br />
                        </td>
                        <td>
                            <xsl:value-of select="marca" /><br />
                        </td>
                        <td>
                            <a href="{web}"><img src="{foto_articulo}" width="180" height="200"/></a>
                        </td>
                        <td>
                            <xsl:value-of select="precio" /><br />
                        </td>
                    </tr>
                </xsl:when>
                </xsl:choose>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

</xsl:stylesheet>
  

в catalogo.xml:

 <?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="catalogo1.xsl"?>
<catalogo>
    <producto>
        <referencia>999999</referencia>
        <nombre-articulo>Samsung Galaxy S7</nombre-articulo>
        <descripcion>Último smartphone de Samsung</descripcion>
        <dep_y_cat>
            <departamento>Electrónica</departamento>
            <categoria>Moviles</categoria>
        </dep_y_cat>
        <colores>Negro</colores>
        <marca>Samsung</marca>
        <precio>500</precio>
        <foto_articulo>images/samsung-galaxy.png</foto_articulo>
        <web>http://www.samsung.com</web>
    </producto>

    <producto>
        <referencia>996599</referencia>
        <nombre-articulo>Iphone 7</nombre-articulo>
        <descripcion>Otro móvil de Apple</descripcion>
        <dep_y_cat>
            <departamento>Electrónica</departamento>
            <categoria>Moviles</categoria>
        </dep_y_cat>
        <colores>Gris</colores>
        <marca>Apple</marca>
        <precio>1000</precio>
        <foto_articulo>images/iphone-7.png</foto_articulo>
        <web>http://www.apple.com</web>
    </producto>

    <producto>
        <referencia>999349</referencia>
        <nombre-articulo>Lenovo PC 5 TB</nombre-articulo>
        <descripcion>Súper portátil Lenovo</descripcion>
        <dep_y_cat>
            <departamento>Electrónica</departamento>
            <categoria>Ordenadores</categoria>
        </dep_y_cat>
        <colores>Negro</colores>
        <marca>Lenovo</marca>
        <precio>1500</precio>
        <foto_articulo>images/lenovo.png</foto_articulo>
        <web>http://www.lenovo.com</web>
    </producto>

    <producto>
        <referencia>921999</referencia>
        <nombre-articulo>Peluche Doraemon</nombre-articulo>
        <descripcion>Peluche relleno de algodon</descripcion>
        <dep_y_cat>
            <departamento>Juguetes</departamento>
            <categoria>Peluches</categoria>
        </dep_y_cat>
        <colores>Azul</colores>
        <marca>Desconocida</marca>
        <precio>7</precio>
        <foto_articulo>images/peluche-doraemon.png</foto_articulo>
        <web>http://www.doraemon.com</web>
    </producto>

    <producto>
        <referencia>902999</referencia>
        <nombre-articulo>Muñeco Spiderman</nombre-articulo>
        <descripcion>Otro muñeco de spiderman</descripcion>
        <dep_y_cat>
            <departamento>Juguetes</departamento>
            <categoria>Muñecos</categoria>
        </dep_y_cat>
        <colores>Rojo</colores>
        <marca>Marvel</marca>
        <precio>25</precio>
        <foto_articulo>images/muñeco-spiderman.png</foto_articulo>
        <web>http://www.marvel.com</web>
    </producto>

    <producto>
        <referencia>899999</referencia>
        <nombre-articulo>iMac</nombre-articulo>
        <descripcion>Ordenador Sobremesa Apple</descripcion>
        <dep_y_cat>
            <departamento>Electrónica</departamento>
            <categoria>Ordenadores</categoria>
        </dep_y_cat>
        <colores>Plateado</colores>
        <marca>Apple</marca>
        <precio>2000</precio>
        <foto_articulo>images/imac.png</foto_articulo>
        <web>http://www.apple.com</web>
    </producto>

    <producto>
        <referencia>999995</referencia>
        <nombre-articulo>Tico Peluche</nombre-articulo>
        <descripcion>Mono de peluche</descripcion>
        <dep_y_cat>
            <departamento>Juguetes</departamento>
            <categoria>Peluches</categoria>
        </dep_y_cat>
        <colores>Marron</colores>
        <marca>Desconocida</marca>
        <precio>5</precio>
        <foto_articulo>images/mono-tico.png</foto_articulo>
        <web>https://www.elcorteingles.es</web>
    </producto>

    <producto>
        <referencia>999399</referencia>
        <nombre-articulo>Samsung Galaxy S6</nombre-articulo>
        <descripcion>Otro smartphone de Samsung</descripcion>
        <dep_y_cat>
            <departamento>Electrónica</departamento>
            <categoria>Moviles</categoria>
        </dep_y_cat>
        <colores>Gris</colores>
        <marca>Samsung</marca>
        <precio>400</precio>
        <foto_articulo>images/samsung-galaxy-s6.png</foto_articulo>
        <web>http://www.samsung.com</web>
    </producto>

    <producto>
        <referencia>991999</referencia>
        <nombre-articulo>Nokia 3310</nombre-articulo>
        <descripcion>Antiguo movil Nokia</descripcion>
        <dep_y_cat>
            <departamento>Electrónica</departamento>
            <categoria>Moviles</categoria>
        </dep_y_cat>
        <colores>Negro</colores>
        <marca>Nokia</marca>
        <precio>50</precio>
        <foto_articulo>images/nokia.png</foto_articulo>
        <web>http://www.nokia.com</web>
    </producto>

    <producto>
        <referencia>909999</referencia>
        <nombre-articulo>Huawei y5</nombre-articulo>
        <descripcion>Movil clase media</descripcion>
        <dep_y_cat>
            <departamento>Electrónica</departamento>
            <categoria>Moviles</categoria>
        </dep_y_cat>
        <colores>Blanco</colores>
        <marca>Huawei</marca>
        <precio>450</precio>
        <foto_articulo>images/huawei-y5.png</foto_articulo>
        <web>http://www.huawei.com</web>
    </producto>

</catalogo>
  

Мне нужно изменить цвет tr, если значения> 60 или <40 или любые другие. Почему when не работает?

Редактировать:

Решено!

Я сделал это:

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/catalogo">
    <html>
        <body>
            <table border="1" width="100%" height="100%">
<tr>
                <th>Referencia</th><th>Descripción</th><th>Marca</th><th>Foto</th><th>Precio</th></tr>
                <xsl:for-each select="producto">
                <xsl:sort select="precio " data-type="number" order="descending"/>
                <tr>
                <xsl:attribute name="bgcolor">
<xsl:choose>
                                <xsl:when test="precio amp;< 20">blue</xsl:when>
                                <xsl:when test="precio amp;> 60">yellow</xsl:when>
                                <xsl:otherwise>purple</xsl:otherwise>
                            </xsl:choose>
                        </xsl:attribute>          
                    <td>
                            <xsl:value-of select="referencia" /><br />
                        </td>
                        <td>
                            <xsl:value-of select="descripcion" /><br />
                        </td>
                        <td>
                            <xsl:value-of select="marca" /><br />
                        </td>
                        <td>
                            <a href="{web}"><img src="{foto_articulo}" width="180" height="200"/></a>
                        </td>
                        <td>
                            <xsl:value-of select="precio" /><br />
                        </td>
                    </tr>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

</xsl:stylesheet>
  

Спасибо michael.hor257k за помощь.

Комментарии:

1. Вы не указали никаких выходных данных, если ни одно из ваших условий не выполнено. Какой цвет вы хотите, если цена 60 или больше?

2. например, фиолетовый.

3. В вашем решении отсутствует tr элемент для строки заголовка заголовки ваших столбцов не соответствуют фактическим данным в столбцах.

4. посмотрите еще раз, пожалуйста. Я думаю, что теперь работает.

5. @GabrielMG: Пожалуйста, примите ответ Майкла. Спасибо.

Ответ №1:

Я бы посоветовал вам попробовать это так:

XSLT 1.0

 <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/catalogo">
    <html>
        <body>
            <table border="1" width="100%" height="100%">
                <tr>
                    <th>Referencia</th>
                    <th>Nombre artículo</th>
                    <th>Descripción</th>
                    <th>Departamento</th>
                    <th>Categoría</th>
                    <th>Precio</th>
                    <th>Foto</th>
                    <th>Web</th>
                </tr>
                <xsl:for-each select="producto">
                    <xsl:sort select="precio " data-type="number" order="descending"/>
                    <tr>
                        <xsl:attribute name="bgcolor">
                            <xsl:choose>
                                <xsl:when test="precio amp;< 20">blue</xsl:when>
                                <xsl:when test="precio amp;< 60">yellow</xsl:when>
                                <xsl:otherwise>purple</xsl:otherwise>
                            </xsl:choose>
                        </xsl:attribute>                   
                        <td>
                            <xsl:value-of select="referencia"/>
                        </td>
                        <td>
                            <xsl:value-of select="nombre-articulo"/>
                        </td>
                        <td>
                            <xsl:value-of select="descripcion"/>
                        </td>
                        <td>
                            <xsl:value-of select="dep_y_cat/departamento"/>
                        </td>
                        <td>
                            <xsl:value-of select="dep_y_cat/categoria"/>
                        </td>
                        <td>
                            <xsl:value-of select="precio" />
                        </td>
                        <td>
                            <a href="{web}"><img src="{foto_articulo}" width="180" height="200"/></a>
                        </td>
                        <td>
                            <xsl:value-of select="web" />
                        </td>
                    </tr>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

</xsl:stylesheet>
  

Примечание:

  • нет ненужного повторения одного и того же кода;
  • упрощение тестов, используя преимущества xsl:choose выхода из первого теста, который возвращает true ;
  • несколько других исправлений.

Рабочая демонстрация: https://xsltfiddle .liberty-development.net/ej9EGcu/1