XSLT: вставка нескольких значений в данные таблицы - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь вставить два или более значений элемента "Infrente" в тд. Это обычно легко, проблема в том, что это для каждого l oop, и я не могу решить проблему. Документ XML выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<gruppo>
    <nome>Casa Miles</nome>
    <studente>
        <id>sergio</id>
        <nome>sergio</nome>
        <cognome>zavota</cognome>
        <scontrino>
            <prodotto>
                <nome>sapone piatti</nome>
                <quantità>1</quantità>
                <costo>3.3</costo>
                <inferente>
                    <id>stefano</id>
                </inferente>
                <inferente>
                    <id>sergio</id>
                </inferente>
            </prodotto>
            <prodotto>
                <nome>bresaola</nome>
                <quantità>1</quantità>
                <costo>5.5</costo>
                <inferente>
                    <id>sergio</id>
                </inferente>
            </prodotto>
            <prodotto>
                <nome>pasta</nome>
                <quantità>10</quantità>
                <costo>0.5</costo>
                <inferente>
                    <id>stefano</id>
                </inferente>
                <inferente>
                    <id>sergio</id>
                </inferente>
            </prodotto>
            <prodotto>
                <nome>pane</nome>
                <quantità>3</quantità>
                <costo>1.4</costo>
                <inferente>
                    <id>stefano</id>
                </inferente>
                <inferente>
                    <id>sergio</id>
                </inferente>
            </prodotto>
            <data>2020-02-03</data>
        </scontrino>
        <pagamenti>
            <data>2020-02-03</data>
            <inferente>
                <id>Stefano</id>
                <quota>-33.0</quota>
            </inferente>
        </pagamenti>
    </studente>
    <studente>
        <id>stefano</id>
        <nome>stefano</nome>
        <cognome>Silvestri</cognome>
        <scontrino>
            <prodotto>
                <nome>shampoo</nome>
                <quantità>2</quantità>
                <costo>2.3</costo>
                <inferente>
                    <id>stefano</id>
                </inferente>
            </prodotto>
            <prodotto>
                <nome>insalata</nome>
                <quantità>4</quantità>
                <costo>0.5</costo>
                <inferente>
                    <id>stefano</id>
                </inferente>
                <inferente>
                    <id>sergio</id>
                </inferente>
            </prodotto>
            <prodotto>
                <nome>hamburger</nome>
                <quantità>1</quantità>
                <costo>3.6</costo>
                <inferente>
                    <id>stefano</id>
                </inferente>
            </prodotto>
            <prodotto>
                <nome>pane</nome>
                <quantità>3</quantità>
                <costo>1.4</costo>
                <inferente>
                    <id>stefano</id>
                </inferente>
                <inferente>
                    <id>sergio</id>
                </inferente>
            </prodotto>
            <data>2020-03-03</data>
        </scontrino>
        <pagamenti>
            <data>2020-03-03</data>
            <inferente>
                <id>Sergio</id>
                <quota>33.0</quota>
            </inferente>
        </pagamenti>
    </studente>
</gruppo>

Как вы видите, иногда в элементе "prodotto" иногда есть два элемента "Infrente". XSLT выглядит следующим образом:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:strip-space elements="yes"/>
<xsl:key name="tableByDataScontrino" match="scontrino" use="data" />

<xsl:template match="/">
  <html>
   <head>
      <title>HTML Document</title>
   </head>

       <style>
            table {
              font-family: arial, sans-serif;
              border-collapse: collapse;
              width: 100%;
            }

            td, th {
              border: 1px solid #dddddd;
              text-align: left;
              padding: 8px;
            }

            tr:nth-child(even) {
                background-color: #dddddd;
            }   

            caption {
              display: table-caption;
              text-align: center;
            }

        </style>

   <body>

    <h3>Benvenuto <xsl:value-of select="gruppo/studente/nome"/></h3>
    <h3>Gruppo: <xsl:value-of select="gruppo/nome"/> </h3>
    <h3>Scontrini</h3>

    <xsl:for-each select="gruppo/studente/scontrino[generate-id() = generate-id(key('tableByDataScontrino',data)[1])]">
        <table>
          <caption style="font-weight: bold;">Data: <xsl:value-of select="data"/></caption>

          <tr>
            <th>Nome</th> 
            <th>Quantità</th>
            <th>Costo</th>
            <th>Totale</th>
            <th>Inferenti</th>      
          </tr>
          <xsl:for-each select="key('tableByDataScontrino',data)/prodotto">
            <xsl:sort select="data" /> 
            <tr>
              <td><xsl:value-of select="nome"/></td>
              <td><xsl:value-of select="quantità"/></td>
              <td><xsl:value-of select="costo"/></td>
              <td>Calcolato tramite Javascript</td>
              <td>
                <xsl:for-each select="prodotto">
                    <xsl:value-of select="inferente"/>
                </xsl:for-each>
              </td>   
            </tr>

          </xsl:for-each>
        </table>
      </xsl:for-each>
   </body>
  </html>
</xsl:template>

</xsl:stylesheet>

Если я не использую оператор for-each внутри данных таблицы td, в ячейке будет напечатан только первый элемент «Infrente» из двух. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Просто измените

         <td>
            <xsl:for-each select="prodotto">
                <xsl:value-of select="inferente"/>
            </xsl:for-each>
          </td>  

на

         <td>
            <xsl:for-each select="prodotto/inferente">
                <xsl:value-of select="."/>
            </xsl:for-each>
          </td>  
0 голосов
/ 10 марта 2020

Таким образом, решение должно измениться:

      <td>
        <xsl:for-each select="prodotto">
            <xsl:value-of select="inferente"/>
        </xsl:for-each>
      </td>

на

      <td>
        <xsl:for-each select="inferente">
            <xsl:value-of select="."/>
        </xsl:for-each>
      </td>
...