增加传递给call-template的变量的值

时间:2013-09-10 19:38:48

标签: xslt

我在模板中有以下一点xsl:

<xsl:variable name="current_x" select="position_x" />
<xsl:variable name="current_y" select="position_y" />
<xsl:if test="units_display='true'">
  <xsl:call-template name="DisplayBox">
    <xsl:with-param name="value"><xsl:value-of select="units" /></xsl:with-param>
    <xsl:with-param name="text" select="'Units'" />
  </xsl:call-template>
</xsl:if>
<xsl:if test="sensor_display='true'">
  <xsl:call-template name="DisplayBox">
    <xsl:with-param name="value"><xsl:value-of select="sensor" /></xsl:with-param>
    <xsl:with-param name="text" select="'Type'" />
  </xsl:call-template>
</xsl:if>

我的通话模板是这样的:

<xsl:template name="DisplayBox">
<xsl:param name="current_x" select="0"/>
<xsl:param name="current_y" select="0"/>
<xsl:param name="value" />
<xsl:param name="text" />
<g transform="translate({$current_x},{$current_y})">
  <rect x="20" y="150" width="220" height="20" fill="#FFFFFF" stroke="black" stroke-width="1" />
  <text x="25" y="168" font-family="arial" font-size="20px" fill="black">
    <xsl:value-of select="$value"/>
  </text>
  <line x1="90" y1="150" x2="90" y2="170" stroke="black" stroke-width="1" />
  <text x="95" y="168" font-family="arial" font-size="20px" fill="black">
    <xsl:value-of select="$text" />
  </text>
</g>
</xsl:template>

这会在矩形内显示“value”和“text”的值。然而,我无法弄清楚如何做的事情是不让它们彼此叠加。如果test =“xxxx_display = true,我想增加current_y值。但我不知道如何实现这一点。

我无法弄清楚如何在调用模板之外增加current_y的值。

编辑:

在调用模板中使用transform translate似乎存在问题。它似乎忽略了这些价值观。

我已将代码修改为:

      <xsl:if test="units_display='true'">
        <g transform="translate({position_x},{position_y})">
          <xsl:call-template name="DisplayBox">
            <xsl:with-param name="value">
              <xsl:value-of select="units" />
            </xsl:with-param>
            <xsl:with-param name="text" select="'Units'" />
          </xsl:call-template>
        </g>
      </xsl:if>
      <xsl:if test="sensor_display='true'">
        <g transform="translate({position_x},{position_y + 20})">
          <xsl:call-template name="DisplayBox">
            <xsl:with-param name="value">
              <xsl:value-of select="sensor" />
            </xsl:with-param>
            <xsl:with-param name="text" select="'Type'" />
          </xsl:call-template>
        </g>
      </xsl:if>

但是,我不想硬编码'position_y + 20'。如果第一个值显示不为真,我希望第二个值在position_y,但如果第一个值显示为真,则第二个值在position_y + 20。这绝对是我希望的。

2 个答案:

答案 0 :(得分:2)

顺便说一下,不要这样做:

<xsl:with-param name="value"><xsl:value-of select="sensor" /></xsl:with-param>

当你的意思是:

<xsl:with-param name="value" select="sensor" />

它不仅冗长,而且效率极低:它不是简单地传递对值的引用,而是构建一个包含文本节点的临时树,该文本节点包含值的副本。创建新树是一项昂贵的操作。

答案 1 :(得分:1)

只需将参数current_xcurrent_y传递给调整后的值,如下所示:

<xsl:if test="units_display='true'">
  <xsl:call-template name="DisplayBox">
    <xsl:with-param name="value"><xsl:value-of select="units" /></xsl:with-param>
    <xsl:with-param name="text" select="'Units'" />
    <xsl:with-param name="current_x" select="position_x"/>
    <xsl:with-param name="current_y" select="position_y + 100"/>
  </xsl:call-template>
</xsl:if>
<xsl:if test="sensor_display='true'">
  <xsl:call-template name="DisplayBox">
    <xsl:with-param name="value"><xsl:value-of select="sensor" /></xsl:with-param>
    <xsl:with-param name="text" select="'Type'" />
    <xsl:with-param name="current_x" select="position_x"/>
    <xsl:with-param name="current_y" select="position_y + 200"/>
  </xsl:call-template>
</xsl:if>

编辑:如果您想采用第二种方法,请尝试将sensor_display部分更改为:

  <xsl:if test="sensor_display='true'">
    <xsl:variable name="offset">
      <xsl:choose>
        <xsl:when test="units_display='true'">20</xsl:when>
        <xsl:otherwise>0</xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <g transform="translate({position_x},{position_y + $offset})">
      <xsl:call-template name="DisplayBox">
        <xsl:with-param name="value">
          <xsl:value-of select="sensor" />
        </xsl:with-param>
        <xsl:with-param name="text" select="'Type'" />
      </xsl:call-template>
    </g>
  </xsl:if>
顺便说一下,如果你改写这样的问题,最好开始一个新问题。