-2

テンプレートで変数を転送して値を取得できることを知りたいです。たとえば、テンプレート A で変数を設定し、テンプレート B で値を取得しますか? call-template を使用しようとしましたが、価値がありません。

<xsl:template name="Transf">
  <xsl:param name="T1"/>
  <xsl:value-of select="$T1"/>
</xsl:template>

<xsl:template match='director/filmDirectors'>
   <xsl:if test="filmDirector='Allen Woody'">
      <xsl:call-template name="Transf">
       <xsl:value-of select="@id"/><xsl:with-param name="T1" select="@id"/>
      </xsl:call-template>
   </xsl:if>

</xsl:template>

<xsl:template match='movie/titles'>
 <xsl:call-template name="Transf">
  <xsl:with-param name="T1"><xsl:value-of select="tile[@id=$T1]"/></xsl:with-param>
 </xsl:call-template>
</xsl:template>

XML ファイル

<list>
 <director>
   <filmDirectors>
    <filmDirector id="steve-s">
     <lname>Spielberg</lname>
     <lfirstname>Steven</lfirstname>
    </filmDirector>

   <filmDirector id="woody-a">
    <lname>Allen<lname>
    <lfirstname>Woody</lfirstname>
   </filmDirector>
 <filmDirectors>
</director>

<movie>
 <titles>
   <title id="steve-s">Jurassic Park</title>
 </titles>
 <titles>
   <title id="woody-a">Small Time Crooks</title>
 </titles>
</movie>

アドバイスをいただけますか?

事前にお返事ありがとうございます。

4

2 に答える 2

1

XML の構造を知らずに解決策を提供することは困難ですが、一般的な考え方は、call-templates の代わりに apply-templates を使用することです。解決策は次のように表示される場合があります。

<xsl:template match='director/filmDirectors'>
   <xsl:apply-templates>
      <xsl:with-param name="filmDirectors" select="." tunnel="yes" />
   </xsl:apply-templates>
</xsl:template>

<xsl:template match='movie/titles'>
  <xsl:param name="filmDirectors" tunnel="yes" />
  <xsl:value-of select="concat('title: ',.,' director: ',$filmDirectors)" />
</xsl:template>
于 2013-03-27T22:34:46.767 に答える
0

あなたの問題はここにあると思います

<xsl:template match='movie/titles'>
 <xsl:call-template name="Transf">
  <xsl:with-param name="T1"><xsl:value-of select="tile[@id=$T1]"/></xsl:with-param>
 </xsl:call-template>
</xsl:template>

という名前の変数/パラメーターを参照しています$T1が、そのような名前の変数/パラメーターがテンプレートに定義されていません。

という名前のグローバル変数/パラメータがない限り$T1、上記のコードはコンパイル時エラーを引き起こします

別の重大なエラーがあります:

<xsl:template match='director/filmDirectors'>
   <xsl:call-template name="Transf">
     <xsl:if test="filmDirector='Allen Woody'">
      <xsl:value-of select="@id"/><xsl:with-param name="T1" select="@id"/>
     </xsl:if>
  </xsl:call-template>
</xsl:template>

xsl:if`xsl:call-template" の子にすることはできません

間違いだらけの質問をする前に、XSLT の入門書を読むことをお勧めします

于 2013-03-28T01:32:43.607 に答える