0

我在模板中有以下 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>

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

我不知道如何在调用模板之外增加 current_y 的值。

编辑:

在调用模板中使用转换翻译似乎有问题。它似乎忽略了这些价值观。

我已将代码修改为:

      <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 处。我希望这一定是可能的。

4

2 回答 2

2

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

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

当你的意思是:

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

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

于 2013-09-10T20:40:28.910 回答
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>

顺便说一句,如果你这样改写你的问题,最好开始一个新问题。

于 2013-09-10T19:47:05.933 回答