如何在xsl:choose中定义XSL变量并赋值

4
我想在XSL中定义一个名为'category'的变量,给它赋值,并在代码的下方重复使用该变量。 如果objecttype=1,变量值应为“car” 如果objecttype=2,变量值应为“bus” 我该如何实现这一点?
<xsl:template match="/">
<html>
<head><style type="text/css">body{font-size:11px;font-family:Verdana;}</style></head>
<body>
Dear
<xsl:for-each select="user">
<xsl:value-of select="firstname"/><xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
<xsl:if test="middlename != ''"> 
<xsl:value-of select="middlename"/><xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:value-of select="user/lastname"/>,<br/>
<br/>
You have created a company listing for "<xsl:value-of select="user/objecttitle"/>".<br/>
<br/>
Did you know Google uses the number of Facebook 'likes' for webpages in its rankings?<br/>
You can like you page here: 
<xsl:for-each select="user"> 
<xsl:variable name="category"> 
    <xsl:choose> 
        <xsl:when test="objecttype='1'">car</xsl:when> 
        <xsl:when test="objecttype='2'">bus</xsl:when> 
    </xsl:choose> 
</xsl:variable> 
</xsl:for-each> 
<a href="http://www.mydomain.com/{$category}/{user/objectid}/{user/objecturl}">Click here to go to your company listing now.</a><br/>
Kind regards,<br/>
<br/>
<br/>
</body>
</html>
</xsl:template>
1个回答

5

对于XSL新手来说,这是一个常见错误。正确的方法是:

<xsl:variable name="category">
  <xsl:choose>
    <xsl:when test="objecttype='1'">car</xsl:when>
    <xsl:when test="objecttype='2'">bus</xsl:when>
    ... etc
  </xsl:choose>
</xsl:variable>

在你的例子中,变量是局部的,仅适用于<xsl:when...>标签。

好的,我尝试了以下两种方法,但是如何检索变量的值呢? {$category} 似乎不起作用...
  1. <xsl:for-each select="user"> <xsl:variable name="category"> xsl:choose <xsl:when test="objecttype='1'">汽车</xsl:when> <xsl:when test="objecttype='2'">公交车</xsl:when> </xsl:choose> </xsl:variable> </xsl:for-each>
  2. <xsl:variable name="category"> <xsl:for-each select="user"> xsl:choose <xsl:when test="objecttype='1'">汽车</xsl:when> <xsl:when test="objecttype='2'">公交车</xsl:when> </xsl:choose> </xsl:for-each> </xsl:variable>
- Adam
你需要扩展你的帖子,包括一个使用此变量的完整简化示例样式表。编辑你的帖子并添加示例。 - Jim Garrison
好的,我添加了完整的XSL代码,希望这能澄清我的需求! :) - Adam
在XSL中,变量的作用域与块结构语言一样。您在for-each内定义了变量,因此它在for-each块之外不存在。我不确定您想要实现什么...链接是否应该在for-each内部?如果不是,您是否打算使用单个链接来显示最后一个用户的类别?这就是代码当前的意思。 - Jim Garrison
我现在有这个,它可以工作: <xsl:for-each select="user"> <xsl:variable name="category"> xsl:choose <xsl:when test="objecttype='1'">汽车</xsl:when> <xsl:when test="objecttype='2'">公交车</xsl:when> </xsl:choose> </xsl:variable> <a href="http://www.mydomain.com/{$category}/{objectid}/{objecturl}">转到您的公司列表</a><br/> </xsl:for-each> 所以问题已经得到了回答,但我仍然想知道如何在块外定义一个变量,然后在任何块内分配一个值给该变量,然后我可以在任何地方使用它。 - Adam
你不能这样做。XSL是一种函数式语言,变量在定义后是只读的。 - Jim Garrison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接