# werte aus zwei xml dateien mit xsl miteinander multiplizieren



## b166er (4. September 2012)

Hallo,

ich habe folgende zwei xml-dateien:
daten1.xml: 
	
	
	



```
<?xml version="1.0" encoding="UTF-8"?>
<rows>
  <value datetime="2012-01-01T00:15:00">15,15</value>
  <value datetime="2012-01-01T00:30:00">14,20</value>
  <value datetime="2012-01-01T00:45:00">13,30</value>
  <value datetime="2012-01-01T01:00:00">12,44</value>
...
</rows>
```

daten2.xml: 
	
	
	



```
<?xml version="1.0" encoding="UTF-8"?>
<rows>
  <value datetime="2012-01-01T00:15:00">25,12</value>
  <value datetime="2012-01-01T00:30:00">25,12</value>
  <value datetime="2012-01-01T00:45:00">25,12</value>
  <value datetime="2012-01-01T01:00:00">25,12</value>
...
</rows>
```

jetzt möchte ich jeden wert abhängig von dem zeitstempel miteinander multiplizieren, daher, der wert aus der zeile mit dem zeitstempel "2012-01-01T00:15:00" darf nur mit dem gleichem zeitstempel aus der anderen datei multipliziert werden, am ende soll eine summe über die multiplizierten werte kommen, wobei die summe kann ich dann mit php auch bilden.

ich hatte zuerst überlegt die zwei xml-dateien im xsl zu laden und beide rows-datasets miteinander zu multiplizieren, hier mein erster versuch mit der xsl: 
	
	
	



```
<xsl:stylesheet version = '1.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:param name="daten1" select="document('1.xml')/rows"/>
<xsl:param name="daten2" select="document('2.xml')/rows"/><!---->
<xsl:template match="/">
     <xsl:value-of select="$daten1/rows/value[@datetime] * $daten2/rows/value[@datetime]"/>
</xsl:template>
</xsl:stylesheet>
```
 dabei hab ich gemerkt dass es so nicht funktioniert da: 
1. als index kann ich kein zeitstempel nehmen da der zeitstempel nur ein attribut vom element ist und ein index ist die zahl die die element-position angibt
2. laut der dokumentation ist eine multiplikation hinter einem [, ( nicht möglich, daher über ein index zuzugreifen und danach zu multiplizieren ist nicht möglich?
3. ausserdem habe ich keine überprüfung dass die richtige zeile mit dem bestimmten zeitstempel auch mit der anderen richtigen zeile multipliziert wird.

nach langem googeln hab ich einen zweiten versuch ausprobiert (erfolglos):
xml-kalkulation: 
	
	
	



```
<?xml version="1.0" encoding="UTF-8"?>
<files>
    <file href="1.xml"/>
    <file href="2.xml"/>
</files>
```
und die dazugehörige xsl datei: 
	
	
	



```
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/files">
    <xsl:variable name="nodes1" select="document(file[1]/@href)/node()" />
    <xsl:variable name="nodes2" select="document(file[2]/@href)/node()" />
    <result>
      <xsl:value-of select="$nodes2/rows//value[1] * $nodes2/rows//value[1]" />
    </result>
  </xsl:template>
</xsl:stylesheet>
```
 bei diesem versuch habe ich versucht die zwei dateien in einer anderen xml-datei zusammen zufassen und mit der xsl zu verarbeiten.

ich vermute, (was ich nicht hoffe) ich muss jeden wert einzeln mit einer for-each-schleife durchgehen und die werte mit einander zu multiplizieren. bei 35000 werten pro datei glaube ich dass es ziemlich langsam dauern wird. ich hatte mir erhofft man könnte alle value-werte auf einen schlag verarbeiten ohne jeden einzelnen durchzugehen.

einen einzelnen wert anzeigen funktioniert, sobald ich aber versuche zwei werte miteinander zu multiplizieren/addieren oder einen einzelnen wert mit number() zu formatieren, kommt es zum "NaN", sollte ich evtl. ein schema definieren wo feststeht dass im <value> tag eine decimal-zahl drin steht?

kann mir jemand dabei helfen oder wenigstens ein hinweis auf eine doku geben wie man es lösen kann?
Vielen Dank!


gruß
b1


----------



## b166er (5. September 2012)

da das xml-format noch garnicht festeht, gehe es vielleicht leichter wenn ich das format wie folgt ändere:

```
<?xml version="1.0" encoding="UTF-8"?>
<rows>
  <row>
    <datetime>2012-01-01T00:15:00</datetime>
    <value>15.15</value>
  </row>
  <row>
    <datetime>2012-01-01T00:30:00</datetime>
    <value>14.20</value>
  </row>
  <row>
    <datetime>2012-01-01T00:45:00</datetime>
    <value>13.30</value>
  </row>
  <row>
    <datetime>2012-01-01T01:00:00</datetime>
    <value>12.44</value>
  </row>
...
</rows>
```

nur kann ich dann mit dem attribut nicht auf die einzelnen werte mit foreach zugreifen, als beispiel: 
	
	
	



```
<xsl:value-of select="$daten1/rows/value[@datetime=$daten2/rows/value[@datetime]]">
```
 oder wie mach ich das?
jemand eine idee?

übrigens, mit dem "NaN"-fehler hab ich raus, es liegt an den zahlen, da muss ein punkt statt komma stehen, habs behoben, jetzt nur noch die werte miteinander multiplizieren (abhängig vom zeitstempel)


----------

