tester23
Goto Top

Xml: Werte mit xsl dividieren

Hallo zuammen,

nach langer Zeit hab ich wieder mal eine Frage.
Ich hoffe jemand kann mit helfen?

Ich habe folgende xml:
<?xml version="1.0" encoding="UTF-8"?><smart:measuringdata xmlns:smart="http://www.abcde">
<smart:data smart:id="DE123456789" smart:series="Entnahme" smart:unit="KWh">
<smart:value smart:date="2015-04-15T00:15:00+01:00">125</smart:value>
<smart:value smart:date="2015-04-15T00:30:00+01:00">124</smart:value>
<smart:value smart:date="2015-04-15T00:45:00+01:00">128</smart:value>
<smart:value smart:date="2015-04-15T01:00:00+01:00">144</smart:value>
<smart:value smart:date="2015-04-15T01:15:00+01:00">123</smart:value>
<smart:value smart:date="2015-04-15T01:30:00+01:00">125</smart:value>
<smart:value smart:date="2015-04-15T01:45:00+01:00">152</smart:value>
<smart:value smart:date="2015-04-15T02:00:00+01:00">104</smart:value>
<smart:value smart:date="2015-04-15T02:15:00+01:00">112</smart:value>
<smart:value></smart:data></smart:measuringdata>

Die Werte hinter dem Datum sind Stromverbrauchswerte in KWh und sollen aber in MWh umgerechnet werden.
Gibt es eine Möglichkeit mit xsl die Werte durch 1000 zu dividieren und auszugeben.

Die ausgegebene Xml sollte gleich aussehen wie die vorgegebene nur die Werte dann in MWh.

Wäre echt dankbar für jegliche Unterstützung.
Mein Wissen reicht leider nicht aus um das zu lösen, deswegen hoffe ich dass mir ein Experte hier helfen kann!?

Gruß
tester23

Content-Key: 269464

Url: https://administrator.de/contentid/269464

Printed on: April 24, 2024 at 10:04 o'clock

Member: colinardo
colinardo Apr 17, 2015 updated at 18:51:59 (UTC)
Goto Top
Hallo tester23,
habe zwar jetzt im Moment nichts als XSL (-edit- siehe weiter u.) aber via Powershell würde ich das so machen. Falls du es gebrauchen kannst face-wink
#Pfad zur XML
$xmlfile = 'c:\temp\smartmeter.xml'   
$xml = New-Object XML
# XML laden
$xml.Load($xmlfile)
# Namespace Manager für verwendeten Namespace in der XML (Bitte anpassen)
[System.Xml.XmlNamespaceManager]$nsm = New-Object System.Xml.XmlNamespaceManager $xml.NameTable
$nsm.AddNamespace('smart','http://www.abcde')  
# Nodes selektieren
$nodes = $xml.SelectNodes("//smart:value",$nsm)  
# für jeden Node
$nodes | %{$_.innerText = [int32]$_.innerText / 1000}
# speichern
$xml.Save($xmlfile)
Grüße Uwe

p.s. Bitte nutze in Zukunft Code-Tags für deinen Quellcode: <code> Quellcode </code> ansonsten gehen hier wichtige Zeichen der XML-Datei verloren, denn so ist es noch nicht mal XML-Konform! Merci.

-edit- mit XSL sollte folgendes gehen
<?xml version="1.0" encoding="UTF-8"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:smart="http://www.abcde">  
	<xsl:output method="xml" encoding="UTF-8" indent="yes"/>  
	<xsl:template match="/smart:measuringdata">  
		<smart:measuringdata>
			<xsl:for-each select="smart:data">  
				<smart:data>
					<xsl:for-each select="@smart:id">  
						<xsl:attribute name="smart:id">  
							<xsl:value-of select="."/>  
						</xsl:attribute>
					</xsl:for-each>
					<xsl:for-each select="@smart:series">  
						<xsl:attribute name="smart:series">  
							<xsl:value-of select="."/>  
						</xsl:attribute>
					</xsl:for-each>
					<xsl:for-each select="@smart:unit">  
						<xsl:attribute name="smart:unit">  
							<xsl:value-of select="."/>  
						</xsl:attribute>
					</xsl:for-each>
					<xsl:for-each select="smart:value">  
						<smart:value>
							<xsl:for-each select="@smart:date">  
								<xsl:attribute name="date">  
									<xsl:value-of select="."/>  
								</xsl:attribute>
							</xsl:for-each>
							<xsl:value-of select="(.) div (1000)"/>  
						</smart:value>
					</xsl:for-each>
				</smart:data>
			</xsl:for-each>
		</smart:measuringdata>
	</xsl:template>
</xsl:stylesheet>
Das ergibt dann folgenden Output für deine XML-Datei
<?xml version="1.0" encoding="UTF-8"?>  
<smart:measuringdata xmlns:smart="http://www.abcde">  
   <smart:data smart:id="DE123456789" smart:series="Entnahme" smart:unit="KWh">  
      <smart:value date="2015-04-15T00:15:00+01:00">0.125</smart:value>  
      <smart:value date="2015-04-15T00:30:00+01:00">0.124</smart:value>  
      <smart:value date="2015-04-15T00:45:00+01:00">0.128</smart:value>  
      <smart:value date="2015-04-15T01:00:00+01:00">0.144</smart:value>  
      <smart:value date="2015-04-15T01:15:00+01:00">0.123</smart:value>  
      <smart:value date="2015-04-15T01:30:00+01:00">0.125</smart:value>  
      <smart:value date="2015-04-15T01:45:00+01:00">0.152</smart:value>  
      <smart:value date="2015-04-15T02:00:00+01:00">0.104</smart:value>  
      <smart:value date="2015-04-15T02:15:00+01:00">0.112</smart:value>  
   </smart:data>
</smart:measuringdata>
Member: tester23
tester23 Apr 20, 2015 at 12:39:52 (UTC)
Goto Top
Hallo colinardo,

vielen Dank, die XSL-Lösung ist genau das was ich gebraucht habe.

Ich hab leider noch eine zusätzliche Frage:
<smart:data smart:id="DE123456789" smart:series="Entnahme" smart:unit="KWh">

Der Wert "smart:unit" müsste in der XSL-Transformation dann auch in "MWh" geändert werden.

Wäre echt super wenn du dazu noch eine Lösung hättest.

Vielen Dank im Voraus
Member: tester23
tester23 Apr 20, 2015 at 14:32:13 (UTC)
Goto Top
Hat sich erledigt, ich habe die Lösung herausgefunden!

Besten Dank noch mal!