如何在select语句中包含XSL模板参数?

时间:2016-03-21 12:11:35

标签: xml xslt-1.0

这是XSL:

  <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>

但现在我只得到&#34; //标签/ LAC&#34;作为我输出中的实际文本。

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 个答案:

答案 0 :(得分:1)

在XSLT 3.0之前,无法评估动态创建的XPath表达式(XSLT 3.0获取xsl:evaluate)。

但在这种特殊情况下,以下静态XPath表达式将起作用:

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