0

我之前问过一个类似的问题。我对代码进行了一些更改,但仍然卡住了。

我有这样的 XSLT 的一部分:

      <xsl:variable name="y" select="0" />
      <xsl:if test="units_display='true'">
          <xsl:call-template name="DisplayBox">
            <xsl:with-param name="current_y" select="$y" />
            <xsl:with-param name="value" select="units" />
            <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="current_y" select="$y" />
            <xsl:with-param name="value" select="sensor" />
            <xsl:with-param name="text" select="'Type'" />
          </xsl:call-template>
      </xsl:if>
      <xsl:if test="offset_display='true'">
          <xsl:call-template name="DisplayBox">
            <xsl:with-param name="current_y" select="$y" />
            <xsl:with-param name="value" select="offset" />
            <xsl:with-param name="text" select="'Offset'" />
          </xsl:call-template>
      </xsl:if>

我的调用模板是这样的:

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

我不知道如何根据 if 语句是否为真来增加 current_y 的值。例如,如果陈述为真,则 y 值需要增加 20,但如果陈述为假,则不需要。

因此,如果所有 3 个语句都是错误的,或者可能是以下任何一种排列,则输出可能为空:

在此处输入图像描述

任何帮助将不胜感激。

4

1 回答 1

0

您必须将整个内容移动到递归模板中。您将“current_y”的 $y 传递给模板的每次调用,其值为“0”。该递归模板将采用相同的参数和两个附加参数:

(1) 该轮递归要执行的测试 (2) 您是否有任何额外的测试要执行(或退出递归)

然后根据测试选择并增加“y”(或不增加)。

* 新信息 *

在根据以下评论进行更多思考之后,使用这样的东西怎么样:

<xsl:template match="units_display | sensor_display | offset_display">
    <xsl:variable name="y-multiplier">
        <xsl:value-of select="count(preceding-sibling::units_display[.='true']) + count(preceding-sibling::sensor_display[.='true']) + count(preceding-sibling::offset_display[.='true'])"/>
    </xsl:variable>
    <xsl:message>
        <xsl:value-of select="$y-multiplier"/>
    </xsl:message>
</xsl:template>

这会在您浏览文档时计算所有符合您标准的元素。这应该让您开始编写不递归的结果。

于 2013-09-10T23:56:05.393 回答