我在模板中有以下一点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。这绝对是我希望的。
答案 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_x
和current_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>
顺便说一下,如果你改写这样的问题,最好开始一个新问题。