2012-02-28 8 views
2

これは私のコードではありません。しかし、私はそれが私がここでそれを使用している理由thatsのsimilerです。私は、パラメータを使用して、「詳細」とパラメータなしの1試合テンプレート上に持つことができているxsltテンプレートを適用し、一致する

<xsl:template match="/"> 
<xsl:apply-templates select="event/details"> 
<xsl:with-param name="title" select="event/title"/> <!-- pass param "title" to matching templates --> 
</xsl:apply-templates> 
</xsl:template> 

<xsl:template match="details"> 
<xsl:param name="title"/> <!-- this template takes parameter "title" --> 
Title: <xsl:value-of select="$title"/><br/> 
Timestamp: <xsl:value-of select="java:DateUtil.getDate(number(timestamp))"/><br/> 
Description: <xsl:value-of select="description"/><br/> 
</xsl:template> 

私の問題hereからこれを得ましたか。私の英語には申し訳ありません。先進的にありがとう。

編集:ここが私の欲しいものです。

template 1 - with parameter: 

<xsl:template match="details"> 
<xsl:param name="title"/> <!-- this template takes parameter "title" --> 
Title: <xsl:value-of select="$title"/><br/> 
Timestamp: <xsl:value-of select="java:DateUtil.getDate(number(timestamp))"/><br/> 
Description: <xsl:value-of select="description"/><br/> 
</xsl:template> 

template 2 - without parameter: 

<xsl:template match="/"> 
<xsl:apply-templates select="event/details"/> 
</xsl:template> 

<xsl:template match="details"> 
Timestamp: <xsl:value-of select="java:DateUtil.getDate(number(timestamp))"/><br/> 
Description: <xsl:value-of select="description"/><br/> 
</xsl:template> 
+0

あなたが意味することはまったく明らかではありません。あなたは、サンプル入力のXMLと望ましい出力も含めて投稿を編集する必要があります。 –

+0

これは意味をなさないことを望みます。申し訳ありませんが、私はxsltに新しいです。基本的に私はC#言語では、パラメータとパラメータなしの関数です。だから私は私がパラメータを持っているときと私がしないときの両方を使用することができます。 – AJP

+0

XSLTの数や型のパラメータに基づいて、同じテンプレート(過負荷)の動的選択はありません。 –

答えて

0

I.同じマッチパターンとの2つのテンプレートを持っている回復可能なエラーである - 最高のケースでは唯一のこれらのは、実行のために選択されます。

具体的な例では、パラメータとともにテンプレートのみを使用し、パラメータに値がないとき(空の文字列)はタイトルが書き込まれないようにコードを少し変更できます。ここ

が小さいこれはを行うことができる方法を実証である:detailsテンプレートマッチングが二回起動され、この変換で

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="event/details"/> 
     =========== 
     <xsl:apply-templates select="event/details"> 
      <xsl:with-param name="title" select="'Title Provided'"/> 
     </xsl:apply-templates> 

    </xsl:template> 

    <xsl:template match="details"> 
     <xsl:param name="title"/> 

    <xsl:value-of select= 
    "concat(substring('Title: ', 
         1 + 7*not(string-length($title) > 0) 
        ), 
      $title) 
    "/> 
     <br/> Timestamp: 
     <xsl:value-of select="'someTimeStamp'"/> 
     <br/> Description: 
     <xsl:value-of select="description"/> 
     <br/> 
    </xsl:template> 

</xsl:stylesheet> 

- $title持つパラメータおよび第2の時間なしで初めてパラメータ。

<br/> Timestamp: 
     someTimeStamp<br/> Description: 
     <br/> 
     =========== 
     Title: Title Provided<br/> Timestamp: 
     someTimeStamp<br/> Description: 
     <br/> 

II:どちらの場合も、テンプレートは、希望の出力を生成します。 XSLTで書かれた関数 - - あなたはxsl:functionで達成することができますしたいどのようなXSLT 2.0

xsl:functionこの機能は(最大)だけXSLT 2.0で利用可能です。同じ関数のさまざまなオーバーロードを書くことは完全に可能であり、我々はこれの多くの例を持っています。

+0

あなたの返事に感謝します。私の場合は、他のプロセスで使用されている既存のxsltファイルを変更しようとしています。いくつかのプロセスのうちの1つにパラメータを追加して少し違うものを出力しようとしています。私は他のプロセスを修正することを避けようとしていました。だから、私はこのメソッドを他の方法で書き直さなければならないだろうと思う。私はこれをオーバーライドできないので..もう一度ありがとう。 – AJP

+0

@AJP:テンプレートが異なる* imported *スタイルシートに属する場合、テンプレートを上書きできます。 'xsl:import'について読んでください。 XSLT 2.0プロセッサを使用している場合は、xsl:functionを使用してください。これは、私の答えのアップデートで説明されているように、異なるオーバーロードを持つことができます。 –

+0

ありがとう..私は私のrequirmentは少し異なるので、私は新しいテンプレートを書くと思う。しかし、私はこのことから知識を得ました。本当にあなたの時間を助け、助けてください。 – AJP

0

あなたの2つのテンプレートは、「タイトルが提供されていればそれを表示する」ということによって本質的に異なります。これを実現するには、パラメータをデフォルトの空のシーケンス(XSLT 2.0ではxsl:paramに1.0よりselect="()"を追加するか、1.0、select="/.."に追加し、if $ titleが存在すれば条件付きロジックをテンプレートに追加しますそれを表示する "。

関連する問題