Beispiel: Summieren von Node-Werten

www.altova.com Dieses Kapitel drucken Vorherige Seite Eine Ebene nach oben Nächste Seite

Startseite >  Funktionen > Importieren benutzerdefinierter XSLT 1.0 oder 2.0-Funktionen >

Beispiel: Summieren von Node-Werten

In diesem Beispiel wird gezeigt, wie Sie mehrere Nodes eines XML-Dokuments verarbeiten und die Ergebnisse als einen einzigen Wert auf ein XML-Zieldokument mappen können. Ziel des Mappings ist es, den Preis aller Produkte in einer XML-Quelldatei zu berechnen und diesen als einen einzigen Wert in eine XML-Ausgabedatei zu schreiben. Die in diesem Beispiel verwendeten Dateien liegen im Ordner %TUTFOLDER%>:

 

Summing-nodes.mfd - die Mapping-Datei
input.xml - die XML-Quelldatei
input.xsd - das XML-Quellschema
output.xsd - die XML-Zieldatei
Summing-nodes.xslt - ein benutzerdefiniertes XSLT-Stylesheet, das eine benannte Vorlage zum Summieren der einzelnen Nodes enthält

 

Es gibt zwei verschiedene Methoden, mit denen Sie das Ziel des Mappings erreichen können:

 

Verwendung der Aggregatfunktion sum der core-Bibliothek. Diese Funktion steht im Fenster Bibliotheken zur Verfügung (siehe auch Arbeiten mit Funktionen).
durch Import eines benutzerdefinierten XSLT-Stylesheet in MapForce

 

 

Lösungsvariante 1: Verwendung der Aggregatfunktion "sum"

Um die Aggregatfunktion sum im Mapping zu verwenden, ziehen Sie sie aus dem Fenster Bibliotheken in das Mapping. Beachten Sie, dass es von der ausgewählten XSLT-Version abhängt (XSLT1 oder XSLT2), welche Funktionen im Fenster Bibliotheken zur Verfügung stehen. Erstellen Sie nun die Mapping-Verbindungen wie unten gezeigt.

mf_map_summing-nodes1

 

Nähere Informationen zu Aggregatfunktionen der core-Bibliothek finden Sie unter core | aggregate functions (Aggregatfunktionen).

 

Lösungsvariante 2: Verwendung eines benutzerdefinierten XSLT-Stylesheet

Wie oben erwähnt, ist das Ziel des Beispiels, die Price-Felder von Produkten in der XML-Quelldatei, in diesem Fall der Produkte A und B, zu summieren.

 

<?xml version="1.0" encoding="UTF-8"?>
<Input xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="input.xsd">
  <Products>
    <Product>
        <Name>ProductA</Name>
        <Amount>10</Amount>
        <Price>5</Price>
    </Product>
    <Product>
        <Name>ProductB</Name>
        <Amount>5</Amount>
        <Price>20</Price>
    </Product>
  </Products>
</Input>

 

In der Abbildung unten sehen Sie ein benutzerdefiniertes XSLT-Stylesheet, in dem die benannte Vorlage (named template) "Total" und ein einziger Parameter string verwendet werden. Die Vorlage verarbeitet die XML-Input-Datei und summiert alle durch den XPath-Ausdruck /Product/Price bereitgestellten Werte.

 

<?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="*">
    <xsl:for-each select=".">
    <xsl:call-template name="Total">
        <xsl:with-param name="string" select="."/>
    </xsl:call-template>
    </xsl:for-each>
  </xsl:template>
   
  <xsl:template name="Total">
  <xsl:param name="string"/>
    <xsl:value-of select="sum($string/Product/Price)"/>
  </xsl:template>
</xsl:stylesheet>

 

Anmerkung:Um die Nodes in XSLT 2.0 zu summieren, ändern Sie die Stylesheet-Deklaration in version="2.0".

 

So importieren Sie das XSLT-Stylesheet in MapForce:

 

1.Wählen Sie als Transformationssprache "XSLT" aus. Nähere Informationen dazu finden Sie unter Auswählen einer Transformationssprache.
2.Klicken Sie im Fenster Bibliotheken auf die Schaltfläche Bibliotheken hinzufügen/entfernen.
3.Wählen Sie im Dialogfeld Optionen das Register Bibliotheken.
4.Klicken Sie auf Hinzufügen und navigieren Sie zur Datei <Dokumente>\Altova\MapForce2019\MapForceExamples\Summing-nodes.xslt.
5.Ziehen Sie die Funktion "Total" aus der neu erstellten Bibliothek "Summing-nodes" ins Mapping und erstellen Sie die Mapping-Verbindungen, wie unten gezeigt.

mf_map_summing-nodes2

 

Um eine Vorschau auf das Mapping-Ergebnis zu sehen, klicken Sie auf das Register Ausgabe. Im Feld Total wird nun die Summe der zwei Price-Felder angezeigt.

 

<?xml version="1.0" encoding="UTF-8"?>
<Output xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="output.xsd">
  <Total>25</Total>
  <Product>
    <Name>ProductA</Name>
    <Amount>10</Amount>
    <Price>5</Price>
  </Product>
  <Product>
    <Name>ProductB</Name>
    <Amount>5</Amount>
    <Price>20</Price>
  </Product>
</Output>


© 2019 Altova GmbH