node
要素は常に4つのグループであることが保証されているため、必要な出力は、グループ化方法(Muenchianや兄弟比較など)を使用せず、おそらくより効率的な非常に単純な変換によって生成できます。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node">
<sample>
<xsl:call-template name="identity"/>
</sample>
</xsl:template>
<xsl:template match="node[not(position() mod 4 = 1)]"/>
</xsl:stylesheet>
この変換が提供されたXMLドキュメントに適用される場合:
<input>
<node>
<id>1</id>
<value>3</value>
</node>
<node>
<id>1</id>
<value>3</value>
</node>
<node>
<id>1</id>
<value>3</value>
</node>
<node>
<id>1</id>
<value>3</value>
</node>
<node>
<id>2</id>
<value>4</value>
</node>
<node>
<id>2</id>
<value>4</value>
</node>
<node>
<id>2</id>
<value>4</value>
</node>
<node>
<id>2</id>
<value>4</value>
</node>
</input>
必要な正しい結果が生成されます:
<input>
<sample>
<node>
<id>1</id>
<value>3</value>
</node>
</sample>
<sample>
<node>
<id>2</id>
<value>4</value>
</node>
</sample>
</input>
説明:
IDルールは、実行対象として選択されたすべてのノードを「現状のまま」コピーします。
別のテンプレートは、その親のst子であるすべてnode
の要素のIDテンプレートをオーバーライドします。このテンプレートはラッパー要素()を生成し、名前でIDテンプレートを呼び出して、それ自体を出力にコピーします。4k+1
node
sample
node
さらに別のテンプレートは、すべての要素のIDテンプレートをオーバーライドします。このテンプレートはすべてのnode
要素に一致しますが、実行対象として選択されます(前のテンプレートよりも優先されます)。前のテンプレートと一致しないノード、つまり親のst 子でnode
はない要素に対してのみ選択されます。これは、このテンプレートが前のテンプレートよりも具体的でないためです。4k+1
node
上記の3.で説明したテンプレートには本体がなく、これにより、一致したnode
要素が出力から効果的に「削除」されます。