TransformXml

Der TransformXml-Prozessor dient dazu, mithilfe eines XSLT-Skriptes XML zu transformieren.

Der Prozessor hat in IGUASU folgende Besonderheiten:

  • die neueste Version des Saxon XSLT-Prozessors 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-Prozessor 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-documents von relationOne und relationTwo werden in die entsprechenden Relationen (Ausgänge) des Prozessors 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.