2016-03-21 7 views
0

はXSLです:XSLテンプレートパラメータをselect文に含めるにはどうすればよいですか?ここ

<xsl:template match="LAC"> 
    <table class="tableLAC"> 
     <tr> 
     <xsl:call-template name="SectionHeading"> 
      <xsl:with-param name="strSection">LAC</xsl:with-param> 
      <xsl:with-param name="iSpanColumns">3</xsl:with-param> 
     </xsl:call-template> 
     </tr> 
    </table> 
    </xsl:template> 

    <xsl:template name="SectionHeading"> 
    <xsl:param name="strSection"/> 
    <xsl:param name="iSpanColumns"/> 
    <tr> 
     <td class="cell{$strSection}" colspan="{$iSpanColumns}"> 
     <div class="text{$strSection}"> 
      <xsl:value-of select="concat('//Labels/', {$strSection})"/> 
     </div> 
     </td> 
    </tr> 
    </xsl:template> 

私が手に問題を伝えるために、すべてを取り除かれています。 SectionHeadingテンプレートは、右のこのビットのために働いていません。

<xsl:value-of select="concat('//Labels/', {$strSection})"/> 

実際には、それは{予期しないトークンであることを私に伝えます。私はこの権利を得ることができません。私はこれを達成しようとしています(手動で書く場合):

<xsl:value-of select="//Labels/LAC"/> 

ありがとうございました。

更新:

<xsl:template name="SectionHeading"> <xsl:param name="strSection"/> <xsl:param name="iSpanColumns"/> <tr> <td class="cell{$strSection}" colspan="{$iSpanColumns}"> <div class="text{$strSection}"> <xsl:value-of select="concat('//Labels/',$strSection)"/> </div> </td> </tr> </xsl:template> 

しかし、今、私は私の出力での実際のテキストとして "//ラベル/ LAC" を取得:

私はこれにそれを修正しました。

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="WEEK-S-140.xsl"?> 
<MeetingWorkBook> 
    <Labels> 
    <TFGW>TREASURES FROM GOD'S WORD</TFGW> 
    <AYFM>APPLY YOURSELF TO THE FIELD MINISTRY</AYFM> 
    <LAC>LIVING AS CHRISTIANS</LAC> 
    </Labels> 
</MeetingWorkBook> 

XMLが削減されました。

更新:

混乱。また、これは動作しません:

<xsl:template name="SectionHeading"> 
    <xsl:param name="strSection"/> 
    <xsl:param name="iSpanColumns"/> 
    <tr> 
     <td class="cell{$strSection}" colspan="{$iSpanColumns}"> 
     <div class="text{$strSection}"> 
      <xsl:variable name="strPath"> 
      <xsl:value-of select="concat('//Labels/',$strSection)"/> 
      </xsl:variable> 
      <xsl:value-of select="$strPath"/> 
     </div> 
     </td> 
    </tr> 
    </xsl:template> 

しかし、私はオーバーライドする場合:

<xsl:template name="SectionHeading"> 
    <xsl:param name="strSection"/> 
    <xsl:param name="iSpanColumns"/> 
    <tr> 
     <td class="cell{$strSection}" colspan="{$iSpanColumns}"> 
     <div class="text{$strSection}"> 
      <xsl:value-of select="//Labels/LAC"/> 
     </div> 
     </td> 
    </tr> 
    </xsl:template> 

を後者が機能すること。したがって、これも動作します:

<xsl:template name="SectionHeading"> 
    <xsl:param name="strSection"/> 
    <xsl:param name="iSpanColumns"/> 
    <tr> 
     <td class="cell{$strSection}" colspan="{$iSpanColumns}"> 
     <div class="text{$strSection}"> 
      <xsl:choose> 
      <xsl:when test="$strSection='TFGW'"> 
       <xsl:value-of select="//Labels/TFGW"/> 
      </xsl:when> 
      <xsl:when test="$strSection='AYFM'"> 
       <xsl:value-of select="//Labels/AYFM"/> 
      </xsl:when> 
      <xsl:when test="$strSection='LAC'"> 
       <xsl:value-of select="//Labels/LAC"/> 
      </xsl:when> 
      </xsl:choose> 
     </div> 
     </td> 
    </tr> 
    </xsl:template> 

しかし、それはテンプレートメソッドを使用するオブジェクトを敗北させます。

答えて

1

XSLT 3.0まで、動的に作成されたXPath式を評価する方法はありません(XSLT 3.0はxsl:evaluateを取得します)。

しかし、この特定のケースでは、以下の、静的なXPath式は動作します:

<div class="text{$strSection}"> 
    <xsl:value-of select="//Labels/*[name() = $strSection]"/> 
</div> 
+0

ビンゴを! Spot on - これまでずっと感謝しています。 :) –

+0

ところで、 '//Labels'が実際にあなたが望むものであることを再確認してください。相対的な表現はここでよりスマートな選択かもしれません。 – Tomalak

+0

いいえ、これは複数回繰り返されるラベルを持つルートノードです。私は30種類以上の言語をサポートしているので、このようにしています。そのため、作成時にラベルを動的に置き換える汎用テンプレートを1つ保持します。それ以外の場合は、ラベル値をXMLノード内で毎回複製する必要があります。 –

関連する問題