XSLT テンプレートをさまざまな場所で再利用するために一般化するさまざまな可能性を学ぼうとしています。これまでのところ、どう進めていいのかわからないケースが 2 件あります。
ケース 1 - ソース XML にノードが含まれる場合がありますFoo1, Foo2, ..., Foo10
(ただし、ノードの一部またはすべてを含む必要はありません)。例えば、
<Foo1>some value</Foo1>
<Foo3>some other value</Foo3>
次のようにノードを作成する必要があります。
<Bar number="1">some value</Bar>
<Bar number="3">some other value</Bar>
現在、私の XSLT は非常に単純です。
<xsl:if test="Foo1 != ''">
<xsl:element name="Bar">
<xsl:attribute name="number">1</xsl:attribute>
<xsl:value-of select="Foo1"/>
</xsl:element>
</xsl:if>
しかし、明らかにこれらのコード ブロックが 10 個必要です。これをどのように一般化できますか?
ケース 2 - ソース XML には、基本的に同じ構造のノードがいくつかあります。
<Foo>
<item>
<Start>2015-06-01</Start>
<End>9999-12-31</End>
<Foo>00000008</Foo>
</item> <!-- 0..n items -->
</Foo>
ノードは名前が異なりますFoo
が、残りは同じままです。構築する必要がある構造は次のようになります。
<Bars>
<Bar From="2015-06-01" To="9999-12-31">
<Value>00000008</Value>
</Bar>
</Bars>
これが私のXSLTの試みですが、ここでも、互いに非常によく似た多くのテンプレートが必要です:
<xsl:element name="Bars>
<apply-templates select="Foo"/>
</xsl:element>
...
<xsl:template match="Foo/item">
<xsl:element name="Bar">
<xsl:attribute name="From">
<xsl:call-template name="convertDate">
<xsl:with-param name="theDate" select="Start"/>
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name="To">
<xsl:call-template name="convertDate">
<xsl:with-param name="theDate" select="End"/>
</xsl:call-template>
</xsl:attribute>
<xsl:element name="Value">
<xsl:value-of select="Foo"/>
</xsl:element>
</xsl:element>
</xsl:template>
繰り返しになりますが、いくつかのテンプレートがありますが、それらはすべて非常によく似ています (つまり、Foo
、Bar
、およびValue
要素の名前が異なるだけです)。これを一般化する、つまり、これらすべてのケースを処理できる単一のテンプレートを提供する機会はありますか?