0

問題

ワイルドカード テンプレート マッチからパススルーすると、パラメータが空になります。

私のxmlソース:

<c:control name="table" flags="all-txt-align-top all-txt-unbold">
    <div xmlns="http://www.w3.org/1999/xhtml">
       <thead>
          <tr>
             <th></th>
          </tr>
       </thead>
       <tbody>
          <tr>
             <td> </td>
          </tr>
       </tbody>
</c:control>

私のXSL:

最初のc:control[@name='table']一致は、XSL アーキテクチャのより広い部分を処理し、メイン テンプレートから呼び出しを分割することです。

<xsl:template match="c:control[@name='table']">
    <xsl:call-template name="table" />
</xsl:template>

次に、別のファイルで名前付きテンプレートを呼び出しますが、これによって開始参照が変更されることはありません。一致したテンプレートにいるかのように c:control[@name='table'] を参照できるはずです。

<xsl:template name="table">
        <xsl:variable name="all-txt-top">
            <xsl:if test="contains(@flags,'all-txt-align-top')">true</xsl:if>
        </xsl:variable>
        <xsl:variable name="all-txt-unbold" select="contains(@flags,'all-txt-unbold')" />

        <div xmlns="http://www.w3.org/1999/xhtml">
            <table>
                <xsl:apply-templates select="xhtml:*" mode="table">
                    <xsl:with-param name="all-txt-top" select="$all-txt-top" />
                    <xsl:with-param name="all-txt-unbold" select="$all-txt-unbold" />
                </xsl:apply-templates>
            </table>
        </div>
    </xsl:template>

all-txt-top上記のテンプレートで値を取得すると、期待どおりに機能します。ただし、以下のテンプレートに渡そうとすると失敗します。何も取得できません。

    <xsl:template match="xhtml:thead|xhtml:tbody" mode="table">
        <xsl:param name="all-txt-top" />
        <xsl:param name="all-txt-unbold" />

        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="*" mode="table" />
        </xsl:element>
    </xsl:template>

単純な文字列をパラメーターとして渡そうとしても、 xhtml:thead テンプレートにはなりません。

どこが間違っているのかわからない...どんな助けでも大歓迎です。

4

1 に答える 1

2

表示されたサンプル コードでは、 c:control要素が一致した後に名前付きテーブルテンプレートを呼び出します。

<xsl:template match="c:control[@name='table']">
  <xsl:call-template name="table" />
</xsl:template> 

これは、テーブルテンプレート内で、現在のコンテキスト要素がc:controlであることを意味します。ただし、サンプル XML では、c:controlの唯一の子は div 要素です。したがって、apply-templates を実行すると....

<xsl:apply-templates select="xhtml:*" mode="table">

...この時点でxhtml:divに一致するテンプレートを探します。そのようなテンプレートがない場合、デフォルトのテンプレート マッチが開始され、要素が無視され、その子が処理されます。ただし、これはパラメーターを渡さないため、xhtml:theadに一致するテンプレートにはパラメーター値がありません。

1 つの解決策は、xhtml:div 要素に明確に一致するテンプレートを用意し、属性を渡すことです。

<xsl:template match="xhtml:div" mode="table">
    <xsl:param name="all-txt-top"/>
    <xsl:param name="all-txt-unbold"/>
    <xsl:apply-templates select="xhtml:*" mode="table">
        <xsl:with-param name="all-txt-top" select="$all-txt-top"/>
        <xsl:with-param name="all-txt-unbold" select="$all-txt-unbold"/>
    </xsl:apply-templates>
</xsl:template>

実際、より多くの要素に対処したい場合は、ここでテンプレート マッチを単に "xhtml:*" に変更して、より一般的なものにすることができます。

于 2012-10-17T11:32:24.540 に答える