0

XML 変換に xsl を使用していますが、そのために複数のルックアップを使用する必要があります。ルックアップ xml の形式は次のとおりです。

<lookups>
    <lookup attr1="val1a" attr2="val1b">
    <lookup attr1="val2a" attr2="val2b">
<lookups>

すべてのルックアップ xml は上記の形式を使用します。たとえば、要素Aのルックアップファイルがあり、要素Bの別のルックアップファイルも同じ要素構造ですが、要素Bに関連する値が異なります。次に、メインのxslファイルで次のようにルックアップを行っています。

<!-- here come the first lookup for element A -->
<xsl:key name="A-lookup" match="lookup" use="@attr1"/>
<xsl:variable name="ALookupDoc" select="document('ALookup.xml')"/>

<xsl:template match="A">
    <Anew>
        <xsl:apply-templates select="$ALookupDoc/*">
        <xsl:with-param name="curr-code" select="string(.)"/>
    </xsl:apply-templates>
    </Anew>
</xsl:template>

<xsl:template match="lookups">
    <xsl:param name="curr-code"/>
    <xsl:value-of select="key('A-lookup', $curr-code)/@attr2"/>
</xsl:template>

<!-- And the second one for element B -->
<xsl:key name="B-lookup" match="lookup" use="@attr1"/>
<xsl:variable name="BLookupDoc" select="document('BLookup.xml')"/>

<xsl:template match="B">
    <Anew>
        <xsl:apply-templates select="$BLookupDoc/*">
        <xsl:with-param name="curr-code" select="string(.)"/>
    </xsl:apply-templates>
    </Anew>
</xsl:template>

<xsl:template match="lookups">
    <xsl:param name="curr-code"/>
    <xsl:value-of select="key('B-lookup', $curr-code)/@attr2"/>
</xsl:template>

今いいよ。問題は、要素 A が正常に機能するための最初のルックアップです。しかし、2番目のものではありません。ご覧のとおり、問題のある部分が 2 つあります。

  1. 両方のルックアップの要素名は同じです (ルックアップとルックアップ)。2 番目のルックアップ XML を異なる要素 (lookupsX と lookupX) に変更すると、それに応じてテンプレートが正常に機能します。
  2. 同じ要素に対して 2 つのテンプレートがあります (要素 A と B のルックアップ)

それでも、問題がどこにあるのか正確にはわかりません。

4

1 に答える 1

1

問題は、まったく同じ値を持つ 2 つのテンプレートがありmatch、そのうちの 1 つだけが実際に使用されていることだと思います。異なるモードを与えることでこれを解決できますが、次のようにするとどうでしょう。

  <!-- here come the first lookup for element A -->
  <xsl:key name="A-lookup" match="lookup" use="@attr1"/>
  <xsl:variable name="ALookupDoc" select="document('ALookup.xml')"/>

  <xsl:template match="A">
    <Anew>
      <xsl:apply-templates select="$ALookupDoc/*">
        <xsl:with-param name="curr-code" select="string(.)"/>
        <xsl:with-param name="keyName" select="'A-lookup'" />
      </xsl:apply-templates>
    </Anew>
  </xsl:template>

  <!-- And the second one for element B -->
  <xsl:key name="B-lookup" match="lookup" use="@attr1"/>
  <xsl:variable name="BLookupDoc" select="document('BLookup.xml')"/>

  <xsl:template match="B">
    <Anew>
      <xsl:apply-templates select="$BLookupDoc/*">
        <xsl:with-param name="curr-code" select="string(.)"/>
        <xsl:with-param name="keyName" select="'B-lookup'" />
      </xsl:apply-templates>
    </Anew>
  </xsl:template>

  <xsl:template match="lookups">
    <xsl:param name="curr-code"/>
    <xsl:param name="keyName" />

    <xsl:value-of select="key($keyName, $curr-code)/@attr2"/>
  </xsl:template>

繰り返しになりますが、2 つのキーはどちらも同じ定義を持っているので、必要ないかもしれません。これが機能するかどうかを確認してください:

  <!-- here come the first lookup for element A -->
  <xsl:key name="lookup" match="lookup" use="@attr1"/>
  <xsl:variable name="ALookupDoc" select="document('ALookup.xml')"/>

  <xsl:template match="A">
    <Anew>
      <xsl:apply-templates select="$ALookupDoc/*">
        <xsl:with-param name="curr-code" select="string(.)"/>
      </xsl:apply-templates>
    </Anew>
  </xsl:template>

  <!-- And the second one for element B -->
  <xsl:variable name="BLookupDoc" select="document('BLookup.xml')"/>

  <xsl:template match="B">
    <Anew>
      <xsl:apply-templates select="$BLookupDoc/*">
        <xsl:with-param name="curr-code" select="string(.)"/>
      </xsl:apply-templates>
    </Anew>
  </xsl:template>

  <xsl:template match="lookups">
    <xsl:param name="curr-code"/>

    <xsl:value-of select="key('lookup', $curr-code)/@attr2"/>
  </xsl:template>
于 2013-02-06T05:24:08.450 に答える