Implementation: Unbekannte Anzahl an Werten addieren

Ich möchte meinen PC aufrüsten und lege eine Liste der Komponenten an:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="Aufr&#252;stplanung.xsl"?>
<COMPUTER xmlns:attr="http://nanoprise.freehostia.de/">
 <Case shop="Caseking" price="59,90">
  <Akasa>AK-ZEN01-WH ZEN</Akasa>
  attr:linkhttp://www.caseking.de/shop/catalog/Gehaeuse/Akasa/Akasa-AK-ZEN01-WH-ZEN-Miditower-white::5993.html</attr:link>
 </Case>
 <Mainboard shop="Mindfactory" price="66,82">
  <Gigabyte>GA-MA770-UD3, 770</Gigabyte>
  attr:linkhttp://www.mindfactory.de/product_info.php/info/p0495062?pid=geizhals</attr:link>
 </Mainboard>
 <CPU shop="Mindfactory" price="168,06">
  <AMD>Phenom II X4 940 BE</AMD>
  attr:linkhttp://www.mindfactory.de/product_info.php/info/p0493341?pid=geizhals</attr:link>
 </CPU>
 <RAM shop="Mindfactory" price="46,83">
  <OCZ>OCZ2P100665GK</OCZ>
  attr:linkhttp://www.mindfactory.de/product_info.php/info/p0426870?pid=geizhals</attr:link>
 </RAM>
 <attr:info label="Gesamt">
  <member>Case</member>
  <member>Mainboard</member>
  <member>CPU</member>
  <member>RAM</member>
 </attr:info>
 <attr:info label="ohne Case">
  <member>Mainboard</member>
  <member>CPU</member>
  <member>RAM</member>
 </attr:info>
</COMPUTER>

Dabei enthält <Case> die Informationen über das Gehäuse, Mainboard die über das Mainboard, usw.
Darin ist jeweils ein Tag mit dem Herstellernamen enthalten, das wiederum den Modellnamen enthält.
Die Tags der Komponenten besitzen die Attribute shop (Shop-Name), price (Preis beim angegebenen Shop) und link (URL zum Produkt), das durch attr:link ersetzt werden kann.

Am Ende der Datei sind 2 Elemente attr:info. Sie sollen den Endpreis in verschiedenen Kombinationen angeben. Die <member>-Elemente, sagen ihnen, welche Komponenten in der Kombination vorhanden sind.

Das XSL-Stylesheet soll diese Preise automatisch ausrechnen.

<xsl:template match="/COMPUTER/attr:info">
  <TR>
   <TD><xsl:value-of select="@label"/>:</TD>
   <TD colspan="2">
    <xsl:for-each select="member">
     <xsl:value-of select="."/>&#32;
    </xsl:for-each>
   </TD>
   <TD>Preis</TD>
  </TR>
</xsl:template>

Doch wie schaffe ich es, die Members auszulesen, das price-Attribut des entsprechenden Tags zu ermitteln und dann alle zu summieren?

  1. Hallo Implementation,

    Das XSL-Stylesheet soll diese Preise automatisch ausrechnen.
    ...
    Doch wie schaffe ich es, die Members auszulesen, das price-Attribut des entsprechenden Tags zu ermitteln und dann alle zu summieren?

    Probiere es mit diesem Ansatz:

    <?xml version="1.0" encoding="UTF-8"?>  
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
      xmlns:attr="http://nanoprise.freehostia.de/" exclude-result-prefixes="attr">  
      
    <xsl:template match="COMPUTER">  
      <table>  
        <thead>  
          <tr>  
            <th>Info</th><th>Preis</th>  
          </tr>  
        </thead>  
        <tbody>  
          <xsl:apply-templates select="attr:info"/>  
        </tbody>  
      </table>  
    </xsl:template>  
      
    <xsl:template match="attr:info">  
      <tr>  
       <td><xsl:value-of select="@label"/>:</td>  
       <td>  
          <xsl:call-template name="preis">  
            <xsl:with-param name="summe" select="0"/>  
            <xsl:with-param name="teile">  
              <xsl:for-each select="member">  
                <xsl:value-of select="concat(.,'|')"/>  
              </xsl:for-each>  
            </xsl:with-param>  
          </xsl:call-template>  
        </td>  
      </tr>  
    </xsl:template>  
      
    <xsl:template name="preis">  
      <xsl:param name="summe"/>  
      <xsl:param name="teile"/>  
      <xsl:choose>  
        <xsl:when test="string-length($teile) > 0">  
          <xsl:call-template name="preis">  
            <xsl:with-param name="summe" select="$summe +  
              number(translate(/COMPUTER/child::*[local-name() = substring-before($teile,'|')]/@price,',','.'))"/>  
            <xsl:with-param name="teile" select="substring-after($teile,'|')"/>  
          </xsl:call-template>  
        </xsl:when>  
        <xsl:otherwise>  
          <xsl:value-of select="$summe"/>  
        </xsl:otherwise>  
      </xsl:choose>  
    </xsl:template>  
      
    </xsl:stylesheet>
    

    Ergebnis:

    Info       Preis
    Gesamt:    341.61
    ohne Case: 281.71

    Grüße,
    Thomas

    1. Hallo Thomas,

      vielleicht interessiert dich: https://forum.selfhtml.org/?t=186551&m=1242002

      Grüße,
      Thomas

      Ja auch!
      Thomas (der andere)

      1. Vielen dank!

        Das hat mir sehr geholfen.