首先,我必须承认我是XML的新手,所以请原谅我愚蠢的问题。
我的目标是获得$majorGoal
的价值。
<xsl:variable name="variable">
<xsl:value-of select="(../@attribute) * 100 />
</xsl:variable>
<xsl:variable name="minorGoal1">
<xsl:choose>
<xsl:when test="$variable < -2">25</xsl:when>
<xsl:when test="$variable >= -2">20</xsl:when>
<xsl:choose>
</xsl:variable>
<xsl:variable name="minorGoal2">
<xsl:choose>
<xsl:when test="$variable < -2">40</xsl:when>
<xsl:when test="$variable >= -2">24</xsl:when>
<xsl:choose>
</xsl:variable>
<xsl:variable name="minorGoal3">
<xsl:choose>
<xsl:when test="$variable < -2">55</xsl:when>
<xsl:when test="$variable >= -2 and < 4">50</xsl:when>
<xsl:when test="$variable >= 4">50</xsl:when>
<xsl:choose>
<xsl:variable name="minorGoal4">
<xsl:choose>
<xsl:when test="$variable < -2">80</xsl:when>
<xsl:when test="$variable >= -2 and < 4">70</xsl:when>
<xsl:when test="$variable >= 4">60</xsl:when>
<xsl:choose>
</xsl:variable>
<!-- I have 10 more similar variables -->
<xsl:variable name="minorGoal">
<xsl:choose>
<xsl:when test="$anotherVariable = 30">
<xsl:value-of select="$minorGoal1"/>
</xsl:when>
<xsl:when test="$anotherVariable = 40">
<xsl:value-of select="$minorGoal2"/>
</xsl:when>
<xsl:when test="$anotherVariable = 50">
<xsl:value-of select="$minorGoal3"/>
</xsl:when>
<xsl:when test="$anotherVariable = 60">
<xsl:value-of select="$minorGoal4"/>
</xsl:when>
<!-- Another 10 more similar variables -->
</xsl:choose>
</xsl:variable>
<xsl:variable name="majorGoal">
<xsl:value-of select="$minorGoal"/>
</xsl:variable>
@attribute引用源xml文件。 $ anotherVariable被定义为一个全局变量,在同一个xsl文件中,并且是常量。
问题是解析器返回错误:
表达预期。 $ variable&gt; = -2和 - &gt;&lt;&lt; - 4
我猜这个问题是由以下原因造成的:
<xsl:when test="$variable >= -2 and < 4">50</xsl:when>
但是如何描述一系列数字?
答案 0 :(得分:1)
正如Mathias已经解释的那样,要测试变量是否介于-2和4之间,您需要这样做:
test="$variable >= -2 and $variable < 4"
然而,choose
的想法是返回true的第一个测试终止进程并返回相应的结果。这意味着代替:
<xsl:variable name="minorGoal4">
<xsl:choose>
<xsl:when test="$variable < -2">80</xsl:when>
<xsl:when test="$variable >= -2 and $variable < 4">70</xsl:when>
<xsl:when test="$variable >= 4">60</xsl:when>
<xsl:choose>
</xsl:variable>
你可以简单地写一下:
<xsl:variable name="minorGoal4">
<xsl:choose>
<xsl:when test="$variable < -2">80</xsl:when>
<xsl:when test="$variable < 4">70</xsl:when>
<xsl:otherwise>60</xsl:otherwise>
<xsl:choose>
</xsl:variable>
更容易阅读,也更有效率。
答案 1 :(得分:1)
你真的需要将XSLT问题标记为XSLT 1.0或2.0,因为答案通常是不同的。
在XSLT 2.0中,您可以说
test="$var = (25 to 40)"
虽然这对优化器提出了一些要求,所以
test="$var ge 25 and $var le 40"
可能更安全。
同样在XSLT 2.0中,您可以简化此
<xsl:variable name="minorGoal4">
<xsl:choose>
<xsl:when test="$variable < -2">80</xsl:when>
<xsl:when test="$variable >= -2 and $variable < 4">70</xsl:when>
<xsl:when test="$variable >= 4">60</xsl:when>
<xsl:choose>
</xsl:variable>
到此:
<xsl:variable name="minorGoal4" select="
if ($variable lt -2) then 80
else if ($variable lt 4) then 70
else 60"/>
额外的好处是结果是数字而不是结果树片段,这可能会更有效率。
答案 2 :(得分:0)
尝试在AND的两个部分中提及$variable
。还要确保$variable
实际上是一个数字而不是字符串或无类型原子。
此外,如果您使用的是XSLT 2.0
,则第一个表达式可以缩短为ge
,这意味着“等于或大于”。
<xsl:when test="number($variable) ge -2 and number($variable) lt 4">
70
</xsl:when>
举例说明:
XML输入
<?xml version="1.0" encoding="utf-8"?>
<root>
<number>6</number>
<number>3</number>
</root>
<强>样式表强>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/root">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="number">
<xsl:copy>
<xsl:choose>
<xsl:when test="number(.) ge -2 and number(.) lt 4">
<xsl:text>YES</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>NO</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<?xml version="1.0" encoding="UTF-8"?>
<root>
<number>NO</number>
<number>YES</number>
</root>