さまざまな構造とタグを持つ多数の XML ファイルに XSL スタイルシートを適用しています。すべてのファイルに 1 つの XSL スタイルシートを使用したいと考えています。新しいコンテンツ構造を持つ XML ファイルが追加された場合に、新しい xpath を簡単に追加できます。
(これは Apache の Solr で使用するためのものであり、出力ドキュメントは特定の方法で表示される必要があると付け加えるかもしれません。)
これまでのところ、さまざまなフィールドをコピーするコードを次のように書くことができました。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt" xmlns:exslt="http://exslt.org/common" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" xalan:indent-amount="4" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:param name="fileName" />
<xsl:param name="fileURI" />
<xsl:param name="timeCreatedLong" />
<add>
<doc>
<!-- REQUIRED FIELDS. DO NOT CHANGE -->
<field name="fileName"><xsl:value-of select="$fileName" /></field>
<field name="fileURI"><xsl:value-of select="$fileURI" /></field>
<field name="timeCreatedLong"><xsl:value-of select="$timeCreatedLong" /></field>
<!-- //END OF REQUIRED FIELDS -->
<!-- DSV INTERNAL XML -->
<!-- Consignment Identifiers -->
<field name="consignmentIdentifiers"><xsl:value-of select="//consignmentlist/consignment/consignmentId" /></field>
<field name="consignmentIdentifiers"><xsl:value-of select="//consignmentlist/consignment/references/reference[@type = 'consignment_number']/value" /></field>
<!-- //Consignment Identifiers -->
<!-- Transport company information -->
<field name="carrier"><xsl:value-of select="//transport/transportservice/carriername" /></field>
<field name="carrierService"><xsl:value-of select="//transport/transportservice/carrierservicename" /></field>
<field name="transportMode"><xsl:value-of select="//transport/transportservice/transportmode" /></field>
<!-- //Transport company information -->
<!-- //DSV INTERNAL XML -->
<!-- POSTEN NORDIC LOGISTICS ORDER.XML -->
<!-- Consignment Identifiers -->
<field name="consignmentIdentifiers"><xsl:value-of select="//TransportJob/Consignment/@consignmentId" /></field>
<!-- //Consignment Identifiers -->
<!-- Transport company information -->
<field name="definedBy"><xsl:value-of select="//TransportJob/@definedBy" /></field>
<field name="carrier"><xsl:value-of select="//TransportJob/@profile" /></field>
<!-- //Transport company information -->
<!-- //POSTEN NORDIC LOGISTICS ORDER.XML -->
</doc>
</add>
</xsl:template>
</xsl:stylesheet>
処理されたファイル構造に応じて、出力は次のようになります。
<add>
<doc>
<field name="fileName">00373323993931432015_BOOKING.INTERNALXML</field>
<field name="fileURI">/usr/dropbox/Dropbox/shared/file-search/00373323993931432015_BOOKING.INTERNALXML</field>
<field name="timeCreatedLong">1377507872000</field>
<field name="consignmentIdentifiers"/>
<field name="consignmentIdentifiers">00373323993931432015</field>
<field name="carrier">DSV</field>
<field name="carrierService">DSV Mypack</field>
<field name="transportMode">ROAD</field>
<field name="consignmentIdentifiers"/>
<field name="definedBy"/>
<field name="carrier"/>
</doc>
</add>
ご覧のとおり、Solr サーバーに送信する前に削除したい空/自己終了要素がいくつかあります。
本当の問題は、この XSL を適用した後に、生成された空のタグを削除する方法があるかどうかです。前述のように、これを同じ XSL ファイルで実行したいと考えています。