我有像这样的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个语句都是假的或者可能是这些排列中的任何一个,则输出可能为空:
非常感谢任何帮助。
答案 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>
在您浏览文档时,它会计算符合您条件的所有元素。这应该让你开始编写没有递归的结果。