TransformXml
Der TransformXml-Processor dient dazu, mithilfe eines XSLT-Skriptes XML zu transformieren.
Der Processor hat in IGUASU folgende Besonderheiten:
-
die neueste Version des Saxon XSLT-Processors mit XSLT 3.0/XPath 3.1 wird unterstützt
-
der lizenzierte Saxon EE inkl. seiner erweiterten Features wird mitgeliefert
-
das XSLT-Skript kann direkt in einem Property gespeichert werden (neben den Varianten des externen Files bzw. des Lookup-Service) - dies erleichtert die Verwendung und das Deployment
-
die direkte Verarbeitung von JSON durch
fn:json-to-xml()
bzw.fn:xml-to-json()
wird durch die Möglichkeit der Einbettung des eingehenden JSON in einen XML-Root-Tag erleichtert -
Ergebnis-Dokumente (
xsl:result-document
) können verwendet werden, um:-
Relationen/Ausgänge des Moduls zu erstellen
-
Attribute im success/failure-Ausgang zu erstellen (hierzu muss der Name des href mit
a:
starten)
-
-
Nutzung der NiFi Expression Language in XPath-Ausdrücken
-
dazu wird der Namespace
xmlns:nf="http://nifi.org"
deklariert -
die aufzurufende Methode heißt el() - z.B.
<xsl:value-of select="nf:el('${UUID()}')"/>
-
Der TransformXml-Processor hat einen spezifischen Editor, der das einfache Bearbeiten des gesamten Skriptes erlaubt.
Die Funktionen werden folgend im Detail erläutert.
Nutzung von Ergebnis-Dokumenten
Voraussetzung:
Support result documents |
true |
Im XSLT sieht das dann so aus:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:output method="xml" name="xml" indent="yes"/>
<xsl:output method="text" name="text"/>
<xsl:template match="/">
<xsl:result-document href="relationOne" format="xml">
<resultOne><xsl:copy-of select="/"/></resultOne>
</xsl:result-document>
<xsl:result-document href="relationTwo" format="text">
number of nodes: <xsl:value-of select="count(//*)"/>
</xsl:result-document>
<xsl:result-document href="a:attributeOne" format="text">something</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
Die Ergebnisse der result-document
s von relationOne
und relationTwo
werden in die entsprechenden Relationen (Ausgänge) des Processors geschrieben.
Diese werden verfügbar, indem Sie im Skript die result-document
-Tags erstellen und das Skript dann speichern.
Das Ergebnis des result-document
von a:attributeOne
wird aufgrund des Prefix a:
als Attribut in die success/failure-Relation geschrieben.
NiFi Expression Language
Die NiFi Expression Language kann sowohl bei der Übergabe von Parametern über Dynamic Properties als auch innerhalb von XPath-Ausdrücken verwendet werden.
EL in Parametern
Durch das Hinzufügen eines beliebigen Dynamic Properties (über den -Button) wird der Inhalt dieses Properties als Parameter (xsl:param
) an das XSLT-Skript übergeben.
Innerhalb des Wertes darf die Expression Language verwendet werden.
Diese kann dabei z.B. auch auf die Attribute des herein gehenden FlowFiles zugreifen:
testParam |
the filename is ${filename} |
Dies kann dann im XSLT verwendet werden:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:output method="text"/>
<xsl:param name="testParam"/>
<xsl:template match="/">
<xsl:value-of select="$testParam"/>
</xsl:template>
</xsl:stylesheet>
Da der filename
in NiFi typischerweise eine UUID ist, kommt als Ergebnis heraus:
the filename is 8ec0e87a-56dc-425f-b4c5-1de7f515ddea
EL in XPath Ausdrücken*
Um die NiFi Expression Language innerhalb von XPath zu verwenden, muss dies zunächst durch das entsprechende Property eingeschaltet werden:
Allow NiFi EL in XPath |
true |
Im XSLT-Skript muss noch der Namespace gesetzt werden (xmlns:nf="http://nifi.org"
).
Dann kann die Funktion (nf:el()
) überall dort, wo XPath-Ausdrücke erlaubt sind, aufgerufen werden:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"
xmlns:nf="http://nifi.org">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select="nf:el('${UUID()}')"/>
</xsl:template>
</xsl:stylesheet>
Das Ergebnis ist:
2560fc8c-3581-4732-8862-6bb191eb0dcc
JSON-Verarbeitung
Um JSON direkt lesen zu können, muss das entsprechende Property gesetzt sein:
Surround input with <xml> tag |
true |
Dadurch wird das eingehende JSON zu einem XML, auf welches dann die XPath-3.0-Funktion angewendet werden kann:
Eingangs-JSON:
{
"name": "Harry",
"age": 23,
"address": {
"city": "London"
}
}
XSLT Skript:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
exclude-result-prefixes="fn" version="3.0">
<xsl:output indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="fn:json-to-xml(.)"/>
</xsl:template>
</xsl:stylesheet>
Ergebnis:
<map xmlns="http://www.w3.org/2005/xpath-functions">
<string key="name">Harry</string>
<number key="age">23</number>
<map key="address">
<string key="city">London</string>
</map>
</map>
Um aus einer solchen XML-Struktur wieder JSON zu machen, können Sie fn:xml-to-json()
nutzen.