0

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>

繰り返しになりますが、いくつかのテンプレートがありますが、それらはすべて非常によく似ています (つまり、FooBar、およびValue要素の名前が異なるだけです)。これを一般化する、つまり、これらすべてのケースを処理できる単一のテンプレートを提供する機会はありますか?

4

1 に答える 1

2

使用できます

<xsl:template match="*[starts-with(local-name(), 'Foo')]">
  <Bar number="{translate(local-name(), translate(local-name(), '1234567890', ''), '')}">
    <xsl:apply-templates/>
  </Bar>
</xsl:template>

最初のサンプル用。

変換する

  <item>
    <Start>2015-06-01</Start>
    <End>9999-12-31</End>
    <Foo>00000008</Foo>
  </item>

  <Bar From="2015-06-01" To="9999-12-31">
    <Value>00000008</Value>
  </Bar>

あなたが使用することができます

<xsl:template match="item">
  <Bar From="{Start}" To="{End}">
    <xsl:value-of select="Foo"/>
  </Bar>
</xsl:template>
于 2016-06-28T12:10:19.930 に答える