使用XSLT迭代增加SVG绘图的y值

时间:2013-09-10 22:50:20

标签: xslt

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

我有像这样的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个语句都是假的或者可能是这些排列中的任何一个,则输出可能为空:

enter image description here

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您必须将整个事物移动到递归模板中。您将$ y传递给“current_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>

在您浏览文档时,它会计算符合您条件的所有元素。这应该让你开始编写没有递归的结果。