lu: Werte abhängig von preceding-sibling summieren

Hallo
ich versuche aus einm Produktionsauftrag in XML der mehrere artikel mit unterschiedlichen mengen beinhaltet, und auch glaich artikel öfters beinhaltet, alle mengen abhängig vom artikel in einem neuen xml zusammenzufassen.

das Quelldokument sieh wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?>
<semiramis xmlns="com.cisag.app.production.obj.ProductionOrder" created="2008-03-18T08:38:15.787Z" locale="en-US-XMLSchemaCompliant" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" nlsMode="MULTI_LANGUAGE" dateTimeMode="COMPACT">
  <ProductionOrder xmlns="com.cisag.app.production.obj.ProductionOrder">
    <number>PA0001</number>
    <quantity>
      <amount>10</amount>
    </quantity>
    <dates>
      <currentBeginDate>2007-10-12T04:00:00.000Z</currentBeginDate>
    </dates>
    <Item>
      <number>P1</number>
    </Item>
    <Details>
      <quantity>
        <amount>10</amount>
      </quantity>
      <dates>
        <currentBeginDate>2007-10-12T04:00:00.000Z</currentBeginDate>
      </dates>
      <Item>
        <number>K21</number>
      </Item>
    </Details>
    <Details>
      <quantity>
        <amount>10</amount>
      </quantity>
      <dates>
        <currentBeginDate>2007-10-12T04:00:00.000Z</currentBeginDate>
      </dates>
      <Item>
        <number>K24</number>
      </Item>
    </Details>
    <Details>
      <quantity>
        <amount>10</amount>
      </quantity>
      <dates>
        <currentBeginDate>2007-10-12T04:00:00.000Z</currentBeginDate>
      </dates>
      <Item>
        <number>K27</number>
      </Item>
    </Details>
    <Details>
      <quantity>
        <amount>10</amount>
      </quantity>
      <dates>
        <currentBeginDate>2007-10-12T04:00:00.000Z</currentBeginDate>
      </dates>
      <Item>
        <number>E26</number>
      </Item>
    </Details>
    <Details>
      <quantity>
        <amount>10</amount>
      </quantity>
      <dates>
        <currentBeginDate>2007-10-12T04:00:00.000Z</currentBeginDate>
      </dates>
      <Item>
        <number>E51</number>
      </Item>
    </Details>
    <Details>
      <quantity>
        <amount>10</amount>
      </quantity>
      <dates>
        <currentBeginDate>2007-10-12T04:00:00.000Z</currentBeginDate>
      </dates>
      <Item>
        <number>P1</number>
      </Item>
    </Details>
    <Details>
      <quantity>
        <amount>10</amount>
      </quantity>
      <dates>
        <currentBeginDate>2007-10-12T04:00:00.000Z</currentBeginDate>
      </dates>
      <Item>
        <number>P1</number>
      </Item>
    </Details>
    <Details>
      <quantity>
        <amount>10</amount>
      </quantity>
      <dates>
        <currentBeginDate>2007-10-12T04:00:00.000Z</currentBeginDate>
      </dates>
      <Item>
        <number>P1</number>
      </Item>
    </Details>
  </ProductionOrder>

quantity/amount soll abhängig von item/number summiert werden!

im moment sieht das ergebnis wie folg aus:

<productionlist>
        <productionlist>
  <production quantity="10" article="P1"/>
 </productionlist>
        <production quantity="10" article="K21"/>
 </productionlist>
 <productionlist>
  <production quantity="10" article="K24"/>
 </productionlist>
 <productionlist>
  <production quantity="10" article="K27"/>
 </productionlist>
 <productionlist>
  <production quantity="10" article="E26"/>
 </productionlist>
 <productionlist>
  <production quantity="10" article="E51"/>
 </productionlist>
 <productionlist>
  <production quantity="10" article="P1"/>
 </productionlist>
 <productionlist>
  <production quantity="10" article="P1"/>
 </productionlist>
        <productionlist>
  <production quantity="10" article="P1"/>
 </productionlist>

Aber: in der Zieldatei soll jeder artikel nur einmal vorkommen,
in diesem beispiel sollte also bei artikel P1  die Production quantity 40 betragen.

wenn mir da jemand weiterhelfen könnte wär ich sehr dankebar, dann könnt ich nämlich mein studium beenden.
also schon mal danke im voraus

lukas

  1. Hallo Lukas,

    Aber: in der Zieldatei soll jeder artikel nur einmal vorkommen,
    in diesem beispiel sollte also bei artikel P1  die Production quantity 40 betragen.

    Wenn das Ergebnis mittels XSLT entstehen soll, dann probiere diesen Ansatz:

    <xsl:key name="groupby" match="Item" use="number"/>  
      
    <xsl:template match="/">  
      <output>  
        <xsl:for-each select="//Item[generate-id() = generate-id(key('groupby',number)[1])]">  
          <xsl:variable name="number" select="number"/>  
          <productionlist>  
            <production quantity="{sum(//amount[../following-sibling::Item[1]/number=$number])}" article="{$number}"/>  
          </productionlist>  
        </xsl:for-each>  
      </output>  
    </xsl:template>
    

    Ergebnis:

    <?xml version="1.0" encoding="UTF-8"?>  
    <output>  
      <productionlist>  
        <production quantity="40" article="P1"/>  
      </productionlist>  
      <productionlist>  
        <production quantity="10" article="K21"/>  
      </productionlist>  
      <productionlist>  
        <production quantity="10" article="K24"/>  
      </productionlist>  
      <productionlist>  
        <production quantity="10" article="K27"/>  
      </productionlist>  
      <productionlist>  
        <production quantity="10" article="E26"/>  
      </productionlist>  
      <productionlist>  
        <production quantity="10" article="E51"/>  
      </productionlist>  
    </output>
    

    Grüße,
    Thomas