おおよそ次のようなxmlファイルがあります。
<batch>
<header>
<headerStuff />
</header>
<contents>
<timestamp />
<invoices>
<invoice>
<invoiceStuff />
</invoice>
<!-- Insert 1000 invoice elements here -->
</invoices>
</contents>
</batch>
そのファイルを、同じ headerStuff と 1 つの請求書だけを持つ 1000 個のファイルに分割したいと思います。Smooks のドキュメントは、変換の可能性を非常に誇りに思っていますが、残念ながら、私はそれらを実行したくありません。
これを行う方法を考え出した唯一の方法は、freemarker で構造全体を繰り返すことです。しかし、それは構造を不必要に繰り返すような気がします。ヘッダーには約 30 の異なるタグがあるため、多くの作業も必要になります。
私が現在持っているのはこれです:
<?xml version="1.0" encoding="UTF-8"?>
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
xmlns:calc="http://www.milyn.org/xsd/smooks/calc-1.1.xsd"
xmlns:frag="http://www.milyn.org/xsd/smooks/fragment-routing-1.2.xsd"
xmlns:file="http://www.milyn.org/xsd/smooks/file-routing-1.1.xsd">
<params>
<param name="stream.filter.type">SAX</param>
</params>
<frag:serialize fragment="INVOICE" bindTo="invoiceBean" />
<calc:counter countOnElement="INVOICE" beanId="split_calc" start="1" />
<file:outputStream openOnElement="INVOICE" resourceName="invoiceSplitStream">
<file:fileNamePattern>invoice-${split_calc}.xml</file:fileNamePattern>
<file:destinationDirectoryPattern>target/invoices</file:destinationDirectoryPattern>
<file:highWaterMark mark="10"/>
</file:outputStream>
<resource-config selector="INVOICE">
<resource>org.milyn.routing.io.OutputStreamRouter</resource>
<param name="beanId">invoiceBean</param>
<param name="resourceName">invoiceSplitStream</param>
<param name="visitAfter">true</param>
</resource-config>
</smooks-resource-list>
これにより、請求書タグごとにファイルが作成されますが、そこから続行してファイルにもヘッダーを取得する方法がわかりません。
編集:
ソリューションは Smooks を使用する必要があります。アプリケーションで汎用スプリッターとして使用し、さまざまな種類の入力ファイルに対してさまざまな smooks 構成ファイルを作成するだけです。