XML - XSLT Formatierung mehrere verschiedene Werte
Hallo zusammen,
ich habe eine Frage zur Konvertierung eines XML Dokuments mit XSLT in ein anderes XML Dokument.
Es geht darum irgendwie eine Abfrage mit herein zu bekommen, die das folgendes Problem löst.
Code der Konvertiert werden soll:
Es geht um die Auflistung der Propertys (Group, Option,Value).
Diese sollten danach so aussehen:
Bein bisheriger Ansatz ist der hier:
Das gibt natürlich nur den ersten Wert wieder raus:
Gibt es dafür eine Lösung?
Freue mich über euere Antworten!
Grüße,
chrisen
ich habe eine Frage zur Konvertierung eines XML Dokuments mit XSLT in ein anderes XML Dokument.
Es geht darum irgendwie eine Abfrage mit herein zu bekommen, die das folgendes Problem löst.
Code der Konvertiert werden soll:
<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<article>
<ordernumber>Nummer</ordernumber>
<mainnumber>Nummer</mainnumber>
<ItmsGrpNam>Art</ItmsGrpNam>
<name>Name</name>
<suppliername>Hersteller</suppliername>
<active>1</active>
<Price>0.000000</Price>
<propertyGroupName>1A</propertyGroupName>
<propertyOptionName>1B</propertyOptionName>
<propertyValueName>1C</propertyValueName>
<propertyGroupName>2A</propertyGroupName>
<propertyOptionName1>2B</propertyOptionName1>
<propertyValueName1>2C</propertyValueName1>
<propertyGroupName>3A</propertyGroupName>
<propertyOptionName2>3B</propertyOptionName2>
<propertyValueName2>3C</propertyValueName2>
</article>
</DocumentElement>
Es geht um die Auflistung der Propertys (Group, Option,Value).
Diese sollten danach so aussehen:
<propertyValue>
<propertyGroupName>1A</propertyGroupName>
<propertyValueName>1B</propertyValueName>
<propertyOptionName>1C</propertyOptionName>
</propertyValue>
<propertyValue>
<propertyGroupName>2A</propertyGroupName>
<propertyValueName>2B</propertyValueName>
<propertyOptionName>2C</propertyOptionName>
</propertyValue>
<propertyValue>
<propertyGroupName>3A</propertyGroupName>
<propertyValueName>3B</propertyValueName>
<propertyOptionName>3C</propertyOptionName>
</propertyValue>
Bein bisheriger Ansatz ist der hier:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<Root>
<articles>
<xsl:for-each select="DocumentElement/article">
<article>
<ordernumber><xsl:value-of select="ordernumber"/></ordernumber>
<mainnumber><xsl:value-of select="mainnumber"/></mainnumber>
<name><xsl:value-of select="name"/></name>
<supplier><xsl:value-of select="suppliername"/></supplier>
<tax>19</tax>
<prices>
<price>
<price><xsl:value-of select="Price"/></price>
</price>
</prices>
<active><xsl:value-of select="active"/></active>
<category>
<categories>
<xsl:choose>
<xsl:when test="ItmsGrpNam='Lager'">39</xsl:when>
<xsl:when test="ItmsGrpNam='Transistor'">40</xsl:when>
<xsl:when test="ItmsGrpNam='Dichtring'">41</xsl:when>
<xsl:when test="ItmsGrpNam='Schütz'">42</xsl:when>
</xsl:choose>
</categories>
</category>
<propertyValue>
<propertyGroupName><xsl:value-of select="propertyGroupName"/> </propertyGroupName>
<propertyOptionName><xsl:value-of select="propertyOptionName"/></propertyOptionName>
<propertyValueName><xsl:value-of select="propertyValueName"/></propertyValueName>
</propertyValue>
</article>
</xsl:for-each>
</articles>
</Root>
</xsl:template>
</xsl:stylesheet>
Das gibt natürlich nur den ersten Wert wieder raus:
<propertyValue>
<propertyGroupName>1A</propertyGroupName>
<propertyOptionName>1B</propertyOptionName>
<propertyValueName>1C</propertyValueName>
</propertyValue>
Gibt es dafür eine Lösung?
Freue mich über euere Antworten!
Grüße,
chrisen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 314026
Url: https://administrator.de/contentid/314026
Ausgedruckt am: 04.12.2024 um 18:12 Uhr
13 Kommentare
Neuester Kommentar
Hallo chrisen,
für XSLT v1.0 habe ich im Moment leider keinen Code, aber für XSLT v2.0 (ACHTUNG: nicht vom NET Framework und meinen vorherigen Skripten unterstützt) bei dem man mehr Möglichkeiten zur Gruppierung hat (for-each-group), sieht das ganze so aus:
Kannst du z.B. hier testen.
Eine Bibliothek für XSLT 2.0 bekommst zu z.B. hier:
http://saxon.sourceforge.net/#F9.7HE
In der Community-Edition von AltovaXML ist auch ein Commandline-Processor für xslt2 enthalten.
Die Community Edition kannst du hier herunterladen.
Damit kannst du die Transformation dann so in der CMD durchführen:
Oder wenn die Community Edition installiert ist kannst du die Bibliothek auch per .NET in Powershell ansprechen:
Oder auch per COM-Object und VBS/VBA:
Grüße Uwe
p.s. Ach ja, bevor ich's vergesse, vielen Dank für deine Spende!
für XSLT v1.0 habe ich im Moment leider keinen Code, aber für XSLT v2.0 (ACHTUNG: nicht vom NET Framework und meinen vorherigen Skripten unterstützt) bei dem man mehr Möglichkeiten zur Gruppierung hat (for-each-group), sieht das ganze so aus:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<Root>
<articles>
<xsl:for-each select="DocumentElement/article">
<article>
<ordernumber><xsl:value-of select="ordernumber"/></ordernumber>
<mainnumber><xsl:value-of select="mainnumber"/></mainnumber>
<name><xsl:value-of select="name"/></name>
<supplier><xsl:value-of select="suppliername"/></supplier>
<tax>19</tax>
<prices>
<price>
<price><xsl:value-of select="Price"/></price>
</price>
</prices>
<active><xsl:value-of select="active"/></active>
<category>
<categories>
<xsl:choose>
<xsl:when test="ItmsGrpNam='Lager'">39</xsl:when>
<xsl:when test="ItmsGrpNam='Transistor'">40</xsl:when>
<xsl:when test="ItmsGrpNam='Dichtring'">41</xsl:when>
<xsl:when test="ItmsGrpNam='Schütz'">42</xsl:when>
</xsl:choose>
</categories>
</category>
<xsl:for-each-group select="*[starts-with(local-name(),'property')]" group-starting-with="*[starts-with(local-name(),'propertyGroupName')]">
<propertyValue>
<propertyGroupName><xsl:value-of select="current-group()[1]" /></propertyGroupName>
<propertyValueName><xsl:value-of select="current-group()[2]" /></propertyValueName>
<propertyOptionName><xsl:value-of select="current-group()[3]" /></propertyOptionName>
</propertyValue>
</xsl:for-each-group>
</article>
</xsl:for-each>
</articles>
</Root>
</xsl:template>
</xsl:stylesheet>
Eine Bibliothek für XSLT 2.0 bekommst zu z.B. hier:
http://saxon.sourceforge.net/#F9.7HE
In der Community-Edition von AltovaXML ist auch ein Commandline-Processor für xslt2 enthalten.
Die Community Edition kannst du hier herunterladen.
Damit kannst du die Transformation dann so in der CMD durchführen:
AltovaXML.exe /xslt2 "C:\tranform.xsl" -in "C:\input.xml" -out "C:\output.xml"
Add-Type -Path "C:\Program Files (x86)\Altova\AltovaXML2013\Altova.AltovaXML.dll"
$class = New-Object Altova.AltovaXML.ApplicationClass
$class.XSLT2.InputXMLFileName = 'C:\input.xml'
$class.XSLT2.XSLFileName = 'C:\transform.xsl'
$class.XSLT2.Execute('C:\output.xml')
set xml = CreateObject("AltovaXML.Application")
xml.XSLT2.InputXMLFileName = "C:\input.xml"
xml.XSLT2.XSLFileName = "C:\transform.xsl"
xml.XSLT2.Execute("C:\output.xml")
p.s. Ach ja, bevor ich's vergesse, vielen Dank für deine Spende!
Dann hast du es nicht mit Admin-Rechten installiert! Du kannst die Registrierung auch nach der Installation nachholen indem du in einer administrativen cmd in das Verzeichnis navigierst und dort den Registrierungsvorgang wiederholst
Klappt das nicht, Rechner neu starten oder du machst noch was anderes falsch. Funktioniert hier unter Win7-10 wie immer einwandfrei. Virenscanner mal vorher deaktivieren.
Aber wie oben geschrieben kannst du auch direkt die exe von altova dazu verwenden (s. Beispiel oben), dann brauchst du kein VBS.
cd "C:\Program Files (x86)\Altova\AltovaXML2013"
AltovaXML_COM.exe /regserver
Aber wie oben geschrieben kannst du auch direkt die exe von altova dazu verwenden (s. Beispiel oben), dann brauchst du kein VBS.
Naturalmente il mio amico.
Als denn frohes Schaffen noch
Uwe
Hatte die Version 2016 installiert, mit der es anscheinend nicht funktioniert hat.
Wozu schreibe ich die Anleitung und poste den korrekten und einzigen Link wenn du sie nicht exakt befolgst und irgendwas anderes runterlädst ?! Eine 2016er Variante davon gab es nie, gäbe es sie, hätte ich diese verlinkt. Die kostenlose Community Edition ist auch nicht mehr bei Altova auf der Webseite gelistet, trotzdem kann man sie noch herunterladen. Was du da geladen hast, weiß der Geier .Als denn frohes Schaffen noch
Uwe