【问题标题】:Using xsl:value-of in xsl:template 's在 xsl:template 中使用 xsl:value-of
【发布时间】:2013-09-09 10:57:42
【问题描述】:

我正在将一个 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 文件中看到“一月”。

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

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

然后我可以看到Januaryyy很好。

所以模板有效,资源存在,但选择值在 call-template 或 xsl:choose 或 xsl:when test 内不起作用

有什么帮助吗? 问候!

【问题讨论】:

  • 是否可以发布您尝试转换的整个 XML?没有它,就很难知道为什么 XPath 找不到您想要的。
  • 另外,xsl:value-of 的参数在您的模板中无效。它应该是&lt;xsl:value-of select="activityExport/resourceKey[key='monthName']/value"/&gt;
  • @BenL 关于您的第一条评论,我会尽快回复。但是,当我尝试 时,我可以看到该值很好,因此该值定义在 XML 中。关于您的第二条评论,这是我只问问题时犯的错误。我已经编辑过了。
  • @BenL 我稍后会尝试用一个简单的例子来创建一个更好的问题。我正在使用的文件很大。

标签: xslt velocity xsl-fo


【解决方案1】:

您的模板可能没问题,只是您从 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 属性(这让我相信您是从不合适的位置调用模板),因此由于 xsl:choosemonth-word 也不会被设置。

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

【讨论】:

  • 谢谢。像魅力一样工作,很好的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多