2

条件の結果に基づいて、さまざまなパラメーターを持つテンプレートを適用したいと思います。このようなもの:

<xsl:choose>
    <xsl:when test="@attribute1">
        <xsl:apply-templates select='.' mode='custom_template'>
            <xsl:with-param name="attribute_name" tunnel="yes">Attribute no. 1</xsl:with-param>
            <xsl:with-param name="attribute_value" tunnel="yes"><xsl:value-of select="@attribute1"/></xsl:with-param>
        </xsl:apply-templates>
    </xsl:when>
    <xsl:when test="@attribute2">
        <xsl:apply-templates select='.' mode='custom_template'>
            <xsl:with-param name="attribute_name" tunnel="yes">Attribute no. 2</xsl:with-param>
            <xsl:with-param name="attribute_value" tunnel="yes"><xsl:value-of select="@attribute1"/></xsl:with-param>
        </xsl:apply-templates>
    </xsl:when>
    <xsl:otherwise>
        <xsl:apply-templates select='.' mode='custom_template'>
            <xsl:with-param name="attribute_name" tunnel="yes">Error</xsl:with-param>
            <xsl:with-param name="attribute_value" tunnel="yes">No matching attribute   </xsl:with-param>
            </xsl:apply-templates>
    </xsl:otherwise>
</xsl:choose>

まず第一に、これははるかに良い方法で解決できると思います。(私は XSLT にまったく慣れていないので、改善を提案し、肥大化したコードを許してください。)

ここで質問です。この条件に基づいてパラメーターを設定し、それらを .xml ファイルで使用するにはどうすればよいxsl:apply-templatesでしょうか。xsl:choose全体を開始/終了タグでラップしようとしましたxsl:apply-templatesが、それは明らかに合法ではありません。手がかりはありますか?

4

3 に答える 3

10

別の方法は、xsl:param 要素内に xsl:choose ステートメントを配置することです。

<xsl:apply-templates select="." mode="custom_template">
   <xsl:with-param name="attribute_name" tunnel="yes">
      <xsl:choose>
         <xsl:when test="@attribute1">Attribute no. 1</xsl:when>
         <xsl:when test="@attribute2">Attribute no. 2</xsl:when>
         <xsl:otherwise>Error</xsl:otherwise>
      </xsl:choose>
   </xsl:with-param>
   <xsl:with-param name="attribute_value" tunnel="yes">
      <xsl:choose>
         <xsl:when test="@attribute1"><xsl:value-of select="@attribute1"/></xsl:when>
         <xsl:when test="@attribute2"><xsl:value-of select="@attribute1"/></xsl:when>
         <xsl:otherwise>No matching attribute </xsl:otherwise>
      </xsl:choose>
   </xsl:with-param>
</xsl:apply-templates>
于 2009-10-21T11:28:53.840 に答える
3

メソッドに問題はありませんが、条件をxsl:template match属性に追加することもできます。xsl:apply-templatesこれは 1 つだけですが、いくつかのxsl:template要素につながります

于 2009-10-21T11:24:17.327 に答える
3

条件を述語に抽出することで、そのすべてのロジックとモードを取り除くことができます。あなたが扱っている要素の名前が何であるかは言いませんが、それが呼び出されたと仮定すると、次のfooようなもので十分です:

<xsl:template match="foo[@attribute1]">
    <!-- 
         do stuff for the case when attribute1 is present 
         (and does not evaluate to false) 
    -->
</xsl:template>

<xsl:template match="foo[@attribute2]">
    <!-- 
         do stuff for the case when attribute2 is present 
         (and does not evaluate to false)
    -->
</xsl:template>

<xsl:template match="foo">
    <!-- 
         do stuff for the general case  
         (when neither attribute1 nor attribute 2 are present) 
    -->
</xsl:template>
于 2009-10-21T13:13:37.367 に答える