xslt检查多个条件,然后按属性属性

时间:2016-03-19 00:40:25

标签: xml xslt xpath conditional-statements

我在Choose内使用Whenfor-each进行多项条件检查

例如,以下简单地检查某个节点的总和,并检查该值是否小于50

<xsl:when test="sum(scores/score) &lt; 50">
    <td>
       <xsl:text>A1</xsl:text>        
    </td>
</xsl:when>

我有五个这样的,它们运行良好,除了最后一个进行多次检查。

我需要检查是否满足这两个条件

  • 总和大于某个数字,比如20
  • @mandatory的属性score等于'True' ,至少有一个score

如果满足这两个条件,我需要运行另一个条件

  • score的值除以另一个属性weight
  • 如果结果小于0.5,则使用<xsl:text>
  • 将结果打印到表中

我试过了

<xsl:when test="sum(scores/score) &gt; 20 and @mandatory='True'">
    <td>
       <xsl:text>F1</xsl:text>        
    </td>
</xsl:when

这甚至无法对mandatory是否等于True进行第二次检查 即使我使用路径scores/score/@mandatory

,结果也是一样的

我已经尝试将第二个条件移动到嵌套在if内的when但是也失败了

<xsl:when test="sum(scores/score) &gt; 20">
<xsl:if test="@mandatory='True'"                 // even if I use scores/score/@mandatory
    <td>
       <xsl:text>F1</xsl:text>        
    </td>
</xsl:when

所以基本上它在第一道障碍时失败了。我想要实现的另一个条件是将scores/score除以scores/score/@weight

我想到了但是还没有能够到达那里玩它

<xsl:if test="(scores/score) div (scores/score/@weight) &lt; 0.5">
     // print result into table
</xsl:if>

以下是与xslt

相关的一些示例xml
 <scores>
          <score no="1" weight="10" mandatory="False">8</score>
          <score no="2" weight="20" mandatory="True">13</score>
 </scores>

只是一个额外的说明。 scores节点可能包含两个以上score个元素。此外,不一定必须是具有mandatory值的"True"属性,同样可能存在多个具有mandatory="true"属性的元素。

以下xml示例有效

多个mandatory="true"

 <scores>
          <score no="1" weight="10" mandatory="False">8</score>
          <score no="2" weight="20" mandatory="True">13</score>
          <score no="3" weight="50" mandatory="True">35</score>
 </scores>

mandatory="true"

 <scores>
          <score no="1" weight="10" mandatory="False">8</score>
          <score no="2" weight="20" mandatory="False">13</score>
          <score no="3" weight="50" mandatory="False">35</score>
 </scores>

1 个答案:

答案 0 :(得分:1)

假设context元素是scores的父元素,那么以下XPath表达式应该可以测试前两个项目符号条件:

sum(scores/score) &gt; 20 and scores/score/@mandatory='True'

然后接下来的两个项目符号可以转换为XPath,如下所示:

scores/score[. div @weight &lt; 0.5]

演示:http://xsltransform.net/bFN1ya7