Anzeige:
Ergebnis 1 bis 3 von 3

Thema: XSLT: xsl:for-each mit concat() und position()

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.11.2005
    Beiträge
    16

    XSLT: xsl:for-each mit concat() und position()

    Hallo,

    Ich versuche die Werte (Value1..3) eines Punktes in einer Tabelle anzuzeigen. Dazu gehe ich in der xsl:for-each Schleife alle Treffer zu "].Value1" durch und versuche mit concat() und position() die anderen Pfade zusammenzubauen. Wie man in Col2 sehen kann, wird der String durch concat() richtig zusammengebaut. Col3 zeigt aber, dass es nicht funktioniert oder ich das concat() falsch in den xPath einbaue.
    Code:
    No   Value1 [m³]   Value2 [°C]   Value3 [%]   Col1              Col2              Col3
    1    640           20            40           Point[1].Value1   Point[1].Value2   640
    2    641           20            40           Point[2].Value1   Point[2].Value2   640
    3    642           20            40           Point[3].Value1   Point[3].Value2   640
    Ich verstehe auch nicht, warum in Col3 3x 640 ausgegeben wird, obwohl ich Value2 referenziere. Wenn alles vor @value kaputt ist oder ignoriert wird, müsste er ja wie in der ersten Spalte den korrekten Value1 ausgeben.

    Wie bekomme ich in jeder Zeile die entsprechenden Werte eines Punktes angezeigt? Mein Ziel ist folgende Ausgabe:
    Code:
    No   Value1 [m³]   Value2 [°C]   Value3 [%]
    1    640           20            40
    2    641           21            41
    3    642           22            42
    Viele Grüße,
    Paul


    HTML-Code:
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/">
    <html>
        <head></head>
        <body>
            <table>
                <tr>
                    <th>No</th>
                    <th>Value1 [m³]</th>
                    <th>Value2 [°C]</th>
                    <th>Value3 [%]</th>
                    <th>Col1</th>
                    <th>Col2</th>
                    <th>Col3</th>
                </tr>
                
                <xsl:for-each select="//*[contains(@name, '].Value1')]">
                <tr>
                    <td>
                        <xsl:value-of select="position()"/>
                    </td>
                    <td>
                        <xsl:value-of select="@value"/>
                    </td>
                    <td>
                        <xsl:value-of select="//item[@name='Point[1].Value2']/@value"/>
                    </td>
                    <td>
                        <xsl:value-of select="//item[@name='Point[1].Value3']/@value"/>
                    </td>
                    
                    <td>
                        <xsl:value-of select="@name"/>
                    </td>
                    <td>
                        <xsl:value-of select="concat('Point[', position(), '].Value2')"/>
                    </td>
                    
                    <td>
                        <xsl:value-of select="//item[concat(@name='Point[', position(), '].Value2')]/@value"/>
                    </td>
                </tr>
                </xsl:for-each>
            
            </table>
        </body>
    </html>
    </xsl:template>
    
    </xsl:stylesheet>
    HTML-Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="report.xsl" ?>
    <root>
      <body>
        <part>
            <values>
              <item name="Point[1].Value1" value="640" unit="m³" />
              <item name="Point[1].Value2" value="20" unit="°C" />
              <item name="Point[1].Value3" value="40" unit="%" />
              <item name="Point[2].Value1" value="641" unit="m³" />
              <item name="Point[2].Value2" value="21" unit="°C" />
              <item name="Point[2].Value3" value="41" unit="%" />
              <item name="Point[3].Value1" value="642" unit="m³" />
              <item name="Point[3].Value2" value="22" unit="°C" />
              <item name="Point[3].Value3" value="42" unit="%" />
            </values>
        </part>
      </body>
    </root>
    Geändert von paule (20-11-2020 um 19:53 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    02.11.2005
    Beiträge
    16

  3. #3
    Registrierter Benutzer
    Registriert seit
    02.11.2005
    Beiträge
    16
    Mit Hilfe eines Kommentars auf Stackoverflow habe ich folgende Lösung gefunden:

    HTML-Code:
    <xsl:for-each select="//item[position() mod 3 = 0 and contains(@name, 'Point')]">
    <tr>
        <td>
            <xsl:value-of select="position()"/>
        </td>
        <td>
            <xsl:value-of select="format-number(@value, '0.00')"/>
        </td>
        <td>
            <xsl:value-of select="following-sibling::item[contains(@name, 'Value2')]/@value"/>
        </td>
        <td>
            <xsl:value-of select="following-sibling::item[contains(@name, 'Value3')]/@value"/>
        </td>
        <td>
            <xsl:value-of select="@name"/>
        </td>
    </tr>
    </xsl:for-each>
    Als kleiner Schönheitsfleck bleibt noch die Konstante für die Modulo-Operation, die angepasst werden muss, wenn sich die Anzahl values pro Punkt ändert.

    Grüße,
    Paul

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •