これには XSLT 2.0 が適しています。(XSLT 2.0 プロセッサが必要な場合は、Saxonをお勧めします。)
たとえば、次の単純な XML ドキュメントは次のとおりです。
<doc>
<foo/>
<bar id="orig-id"/>
</doc>
そして、この XSLT 2.0 スタイルシート:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="threshold" select="10"/>
<xsl:template match="@*|node()" mode="clone">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="clone"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*/bar/@id" mode="clone">
<xsl:param name="doc-id" tunnel="yes"/>
<xsl:attribute name="id" select="$doc-id"/>
</xsl:template>
<xsl:template match="/" name="createDocs">
<xsl:param name="dashNbr" select="1"/>
<xsl:variable name="doc-id" select="concat(generate-id(),'-',$dashNbr)"/>
<xsl:result-document href="{$doc-id}.xml">
<xsl:apply-templates select="/*" mode="clone">
<xsl:with-param name="doc-id" select="$doc-id" tunnel="yes"/>
</xsl:apply-templates>
</xsl:result-document>
<xsl:if test="$threshold > $dashNbr">
<xsl:call-template name="createDocs">
<xsl:with-param name="dashNbr" select="$dashNbr + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
固有のid
属性を持つ 10 個のファイルを生成します。ファイル名は ID に基づいています。
例:
d1-1.xml
<doc>
<foo/>
<bar id="d1-1"/>
</doc>
d1-2.xml
<doc>
<foo/>
<bar id="d1-2"/>
</doc>
d1-10.xml
<doc>
<foo/>
<bar id="d1-10"/>
</doc>
paramの値をthreshold
作成したいファイルの数に変更し、変更しmatch
たい属性の を変更するだけで済みます。