XSL的编号范围

时间:2014-01-27 13:57:38

标签: xml xslt logical-operators

首先,我必须承认我是XML的新手,所以请原谅我愚蠢的问题。

我的目标是获得$majorGoal的价值。

<xsl:variable name="variable">
  <xsl:value-of select="(../@attribute) * 100 />
</xsl:variable>
<xsl:variable name="minorGoal1">
  <xsl:choose>
    <xsl:when test="$variable &lt; -2">25</xsl:when>
    <xsl:when test="$variable &gt;= -2">20</xsl:when>
  <xsl:choose>
</xsl:variable>
<xsl:variable name="minorGoal2">
  <xsl:choose>
    <xsl:when test="$variable &lt; -2">40</xsl:when>
    <xsl:when test="$variable &gt;= -2">24</xsl:when>
  <xsl:choose>
</xsl:variable>
<xsl:variable name="minorGoal3">
  <xsl:choose>
    <xsl:when test="$variable &lt; -2">55</xsl:when>
    <xsl:when test="$variable &gt;= -2 and &lt; 4">50</xsl:when>
    <xsl:when test="$variable &gt;= 4">50</xsl:when>
  <xsl:choose>
<xsl:variable name="minorGoal4">
  <xsl:choose>
    <xsl:when test="$variable &lt; -2">80</xsl:when>
    <xsl:when test="$variable &gt;= -2 and &lt; 4">70</xsl:when>
    <xsl:when test="$variable &gt;= 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 &gt;= -2 and &lt; 4">50</xsl:when>

但是如何描述一系列数字?

3 个答案:

答案 0 :(得分:1)

正如Mathias已经解释的那样,要测试变量是否介于-2和4之间,您需要这样做:

 test="$variable &gt;= -2 and $variable &lt; 4"

然而,choose的想法是返回true的第一个测试终止进程并返回相应的结果。这意味着代替:

<xsl:variable name="minorGoal4">
  <xsl:choose>
    <xsl:when test="$variable &lt; -2">80</xsl:when>
    <xsl:when test="$variable &gt;= -2 and $variable &lt; 4">70</xsl:when>
    <xsl:when test="$variable &gt;= 4">60</xsl:when>
  <xsl:choose>
</xsl:variable>

你可以简单地写一下:

<xsl:variable name="minorGoal4">
  <xsl:choose>
    <xsl:when test="$variable &lt; -2">80</xsl:when>
    <xsl:when test="$variable &lt; 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 &lt; -2">80</xsl:when>
    <xsl:when test="$variable &gt;= -2 and $variable &lt; 4">70</xsl:when>
    <xsl:when test="$variable &gt;= 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>