Announcement

Collapse
No announcement yet.

Muenchian Methode

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Muenchian Methode

    Hallo,

    ich möchte XSLT lernen und stehe noch recht am Anfang. Ich stehe aber schon vor dem ersten Problem: Ich möchte folgende Datei bearbeiten:

    Die Ausgangsdatei sieht in etwa so aus:

    Code:
    <cars>
      <car no="1">
        <driver name="D1"/>
        <price>10000</price>
        <model>Model1<model>
      </car>
    
    
      <car no="2">
        <driver name="D3"/>
        <price>13000</price>
        <model>Model1<model>
      </car>
    
      <car no="3">
        <driver name="D2"/>
        <price>14000</price>
        <model>Model1<model>
      </car>
    
      <car no="4">
        <driver name="D3"/>
        <price>16000</price>
        <model>Model2<model>
      </car>
    .
    .
    </cars>
    Mein Ziel ist es den Durchschnitt der Preise für jeden Fahrer zu berechnen und dies gruppiert ausgeben. Die Zieldatei sieht dann in etwa so aus:

    Code:
      <driver>
        <name>D1</name>
        <avgprice>xxxx</avgprice>
      </driver>
      <driver>
        <name>D2</name>
        <avgprice>xxxx</avgprice>
      </driver>
      <driver>
        <name>D3</name>
        <avgprice>xxxx</avgprice>
      </driver>
    Ich hab schon viel über die Muenchian Methode gelesen, komme aber irgendwie trotzdem nicht zurecht. Vielleicht kann mir hier jemand helfen und mir bei meinem Lernen helfen! Danke
    mein blog: b[as-t]log

  • #2
    Für diese Aufgabe empfehle ich die Verwendung von XSLT 2.0 und XPath 2.0. Mittels xsl:for-each-group, current-group() und fn:avg() lässt sich das gewünschte Ergebnis in kompakter Form gewinnen:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:fn="http://www.w3.org/2005/xpath-functions">
    	
      <xsl:output method="xml" exclude-result-prefixes="xs fn"/>
    
      <xsl:template match="cars">
        <drivers>
        <xsl:for-each-group select="car" group-by="driver/@name">
        <xsl:sort select="driver/@name" data-type="text"/>
          <driver>
            <name><xsl:value-of select="current-group()[1]/driver/@name"/></name>
            <avgprice><xsl:value-of select="fn:avg(current-group()/price)"/></avgprice>
          </driver>
        </xsl:for-each-group>
        </drivers>
      </xsl:template>
      
    </xsl:stylesheet>
    Zum Prozessieren eignen sich z. B. Saxon 8.9(B) und AltovaXML 2007.

    XML-Ergebnis:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <drivers>
      <driver>
        <name>D1</name>
        <avgprice>10000</avgprice>
      </driver>
      <driver>
        <name>D2</name>
        <avgprice>14000</avgprice>
      </driver>
      <driver>
        <name>D3</name>
        <avgprice>14500</avgprice>
      </driver>
    </drivers>

    Comment


    • #3
      compliation error for-each-group

      Habe ein anloges Problem: soll auch Stylesheet erstellen (auch gruppierte Ausgabe & avg berechnen) . Mein XML Sheet sieht folgendermaßen aus
      Code:
      <?xml version="1.0" encoding="iso-8859-1"?>
      <books>
        <book no="1">
          <publisher name="P1"/>
          <price>10</price>
          <title>T1</title>
        </book>
      
       <book no="2">
          <publisher name="P1"/>
          <price>20</price>
          <title>T3</title>
        </book>
      
       <book no="3">
          <publisher name="P2"/>
          <price>20</price>
          <title>T2</title>
        </book>
      Wenn ich aber die oben vorgeschlagene Stylesheet Vorlage anwende erhalte ich folgende Fehlermeldung:
      compliation error> sort is not allowed in that context
      und er erkennt for-each-goup nicht- kann das an der stylesheet version liegen?
      Danke

      Comment


      • #4
        xsl:for-each-group stammt aus XSLT 2.0. In der XSLT FAQ und auch hier im Forum gibt es Ansätze für 1.0-Umsetzungen.

        Comment

        Working...
        X