在xsl:template中使用xsl:value-of

时间:2013-09-09 10:57:43

标签: xslt velocity xsl-fo

我将xml文件传递给我的fo文件,如下所示:

<?xml version="1.0"?>
    <activityExport>
    <resourceKey>
    <key>monthName</key>
    <value>January</value>
    </resourceKey>

所以,如果我直接使用:

<xsl:value-of select="activityExport/resourceKey[key='monthName']/value"/>

我可以在PDF文件中看到“1月”就好了。

但是,如果我在模板中使用它,我有:

<xsl:template name="format-month">
    <xsl:param name="date"/>
    <xsl:param name="month" select="format-number(substring($date,6,2), '##')"/>
    <xsl:param name="format" select="'m'"/>
    <xsl:param name="month-word">
        <xsl:choose>
            <xsl:when test="$month = 1"><xsl:value-of select="activityExport/resourceKey[key='monthName']/value"/>
</xsl:when>

当我打电话时,我看不到“一月”:

<xsl:variable name="monthName">
    <xsl:call-template name="format-month">
    <xsl:with-param name="format" select="'M'"/>
    <xsl:with-param name="month" select="@monthValue"/>
    </xsl:call-template>
    </xsl:variable>
    <xsl:value-of select="concat($monthName,' ',@yearValue)"/>

我知道我的模板有效,因为如果我有一个静态字符串:

        <xsl:choose>
            <xsl:when test="$month = 1">Januaryyy</xsl:when>

然后我可以看到Januaryyyy很好。

因此模板工作,资源存在,但是select-value不能在call-template或xsl:choose或xsl:test中进行测试

有任何帮助吗? 此致!

1 个答案:

答案 0 :(得分:2)

您的模板可能没问题,只是您从XML中的不合适位置调用它。因此,您用来设置month-word的XPath找不到任何东西 - 它是一条通向任何东西的路径。

例如,以下XSLT样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template name="format-month">
    <xsl:param name="date"/>
    <xsl:param name="month" select="format-number(substring($date,6,2), '##')"/>
    <xsl:param name="format" select="'m'"/>
    <xsl:param name="month-word">
      <xsl:choose>
        <xsl:when test="$month = 1">
          <xsl:value-of select="activityExport/resourceKey[key='monthName']/value"/>
        </xsl:when>
      </xsl:choose>
    </xsl:param>

    <xsl:value-of select="$month-word"/>
  </xsl:template>

  <xsl:template match="/">
    <xsl:variable name="monthName">
      <xsl:call-template name="format-month">
        <xsl:with-param name="month" select=" '1' "/>
        <xsl:with-param name="format" select="'M'"/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:value-of select="concat($monthName,' ',@yearValue)"/>
  </xsl:template>

</xsl:stylesheet>

应用于此XML:

<activityExport>
  <resourceKey>
    <key>monthName</key>
    <value>January</value>
  </resourceKey>
</activityExport>

生成此输出:

January 

请注意,我已将month参数替换为您的模板,其值为1。此输入XML中没有元素具有@monthValue属性(这使我相信您从不适合的位置调用模板),因此month-word不会因{{1}而设置}}

为了使您的实际输入XML正常工作,您可以尝试用xsl:choose替换XPath,其中双斜杠定义XML文档中任何地方的路径。如果只有一个"//activityExport/resourceKey[key='monthName']/value"节点,这应该没问题。否则,您将需要找出合适的XPath。