XML モジュールを使用した XSLT 変換

<xml-module:xslt-transform> 要素は入力 XML ドキュメントを受け入れ、XSL スタイルシートを使用して変換できます。

MuleSoft は XSLT 標準をサポートしていますが、DataWeave でも同じユースケースを実現でき、XML ドキュメントを抽出して変換するツールとして DataWeave をお勧めします。

次の入力ドキュメントについて考えます。

入力例
<?xml version="1.0" encoding="UTF-8"?>
<cities>
    <city name="milan"  country="italy"   pop="5"/>
    <city name="paris"  country="france"  pop="7"/>
    <city name="munich" country="germany" pop="4"/>
    <city name="lyon"   country="france"  pop="2"/>
    <city name="venice" country="italy"   pop="1"/>
</cities>

次のように変換できます。

XSLT 変換スクリプト
<xml-module:xslt-transform>
    <xml-module:xslt><![CDATA[
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

        <xsl:template match="/">
            <table>
            <tr>
                <th>Country</th>
                <th>City List</th>
                <th>Population</th>
            </tr>
            <xsl:for-each-group select="cities/city" group-by="@country">
                <tr>
                    <td>
                        <xsl:value-of select="@country"/>
                    </td>
                    <td>
                        <xsl:value-of select="current-group()/@name" separator=", "/>
                    </td>
                    <td>
                        <xsl:value-of select="sum(current-group()/@pop)"/>
                    </td>
                </tr>
            </xsl:for-each-group>
            </table>
        </xsl:template>
    </xsl:stylesheet>
]]></xml-module:xslt>
</xml-module:xslt-transform>

上記のスクリプトは、次のドキュメントを出力します。

出力
<table>
    <tr>
        <th>Country</th>
        <th>City List</th>
        <th>Population</th>
    </tr>
    <tr>
        <td>italy</td>
        <td>milan, venice</td>
        <td>6</td>
    </tr>
    <tr>
        <td>france</td>
        <td>paris, lyon</td>
        <td>9</td>
    </tr>
    <tr>
        <td>germany</td>
        <td>munich</td>
        <td>4</td>
    </tr>
</table>

デフォルトではこの操作はメッセージペイロードレベルで入力ドキュメントを検索しますが、独自の入力を指定できます。たとえば、都市がペイロード内の JSON 配列だったとします。たとえば次のように、最初に XML に変換してから XSL 変換を実行することもできます。

XSLT 変換スクリプト
<xml-module:xslt-transform>
    <xml-module:content><![CDATA[
                %dw 2.0
                input payload application/json encoding='UTF-8'
                output application/xml encoding='UTF-8'
                ---
                payload.cities
    ]]></xml-module:content>
    <xml-module:xslt><![CDATA[
        // THE XSLT
    ]]></xml-module:xslt>
</xml-module:xslt-transform>

XSL スタイルシートの個別のファイルへの外部化

XSLT スクリプトを Mule アプリケーションに組み込まずに済むように、次のように、ファイルを使用してモジュールに渡すことができます。

<xml-module:xslt-transform>
    <xml-module:xslt>${file::xlst/cities.xslt}</xml-module:xslt>
</xml-module:xslt-transform>

より複雑なユースケースでは、使用するスクリプトが外的な条件に応じて異なる場合もあります。たとえば、使用する変換が userId に応じて異なるマルチテナントのインテグレーションを考えてみます。

<flow name="multitenantExample">
    <http:listener path="transform" allowedMethods="POST" config-ref="httpListener" /> // 1
    <file:read path="#['xslt/$(attributes.queryParam.userId).xslt']" target="xslt" />
    <xml-module:xslt-transform>
        <xml-module:xslt>#[vars.xslt]</xml-module:xslt>
    </xml-module:xslt-transform>
</flow>
  1. このフローは HTTP 要求によってトリガされます。

  2. この例では、userId がクエリパラメータとして提供されていることと想定し、ファイルコネクタを使用して正しい XSL が含まれるファイルを読み取り、変数に保存します。

  3. この例では、Read 操作を使用して取得された XSL シートを参照する式を使用して変換を実行します。

HTTP コネクタとファイルコネクタは単に例として使用しています。同様のユースケースを実行するために必要なわけではありません。

コンテキストプロパティの使用

XML モジュールは XSL 言語と同じように、変換にパラメータを渡すことができるコンテキストプロパティを提供します。次の例では、<xml-module:context-properties/> 要素に引数マップを作成する DataWeave 式が含まれています。

<xml-module:xslt-transform>
    <xml-module:xslt><![CDATA[
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
        <xsl:output method="xml"/>

        <xsl:param name="vtn" /> (1)
        <xsl:template match="/parameter">
            <param><xsl:value-of select="$vtn"/></param> (2)
        </xsl:template>
    </xsl:stylesheet>
]]></xml-module:xslt>
    <xml-module:context-properties>#[{'vtn' : 'some value'}] (3)
    </xml-module:context-properties>
</xml-module:xslt-transform>
  1. XSL スタイルシートは vtn と呼ばれる param を宣言します。

  2. スタイルシートは $ プレフィックスを使用して param の割り当てられた値を参照します。

  3. この例では、context-properties パラメータを使用して値を内部に渡します。

出力 MIME タイプ

XSLT の最も一般的なユースケースは新しい XML ドキュメントの出力です。ただし、XSLT は JSON、CSV、または単純なテキストや数値などの他の形式でドキュメントを生成することもできます。そのため、生成された値では特定の MIME タイプが割り当てられません。outputMimeType パラメータを使用して MIME タイプを指定することをお勧めします。

関連情報

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub