使用xsl:选择更新单个元素属性

时间:2013-07-25 10:41:21

标签: xslt

我有以下XSLT段可以正常工作。它根据@status varibale生成具有给定颜色的元素。

问题在于它非常不优雅。我在每个xsl:when section重复相同的值。

<xsl:template match="Task">
       <xsl:choose>
        <xsl:when test="@status = 'Completed'">
         <task name="{@title}"  processId="{@resourceId}" start="{@start}" end="{@end}" Id="{@id}"  color="006d0f" borderColor="E1E1E1"  />
        </xsl:when>
        <xsl:when test="@status = 'Failed'">
         <task name="{@title}"   processId="{@resourceId}" start="{@start}" end="{@end}" Id="{@id}"  color="FF0000" borderColor="E1E1E1"  />
        </xsl:when>
         <xsl:when test="@status = 'Risk'">
         <task name="{@title}"  processId="{@resourceId}" start="{@start}" end="{@end}" Id="{@id}"  color="FF9900" borderColor="E1E1E1"  />
        </xsl:when>
           <xsl:when test="@status = 'OnGoing'">
         <task name="{@title}"  processId="{@resourceId}" start="{@start}" end="{@end}" Id="{@id}" color="14f824" borderColor="E1E1E1"  />
        </xsl:when>
        <xsl:otherwise>
            <task name="{@title}" processId="{@resourceId}" start="{@start}" end="{@end}" Id="{@id}"  color="e8e8e8" borderColor="E1E1E1"  />
        </xsl:otherwise>
      </xsl:choose>
  </xsl:template>

正如您所看到的,唯一可以改变的是颜色属性。

有没有办法让我拥有一个任务元素并拥有xsl:choose只选择更新颜色属性?

提前致谢...

2 个答案:

答案 0 :(得分:3)

您可以移动choose元素内的task,并使用<xsl:attribute>创建一个属性节点:

  <task name="{@title}"  processId="{@resourceId}" start="{@start}" end="{@end}" Id="{@id}" borderColor="E1E1E1">
   <xsl:choose>
    <xsl:when test="@status = 'Completed'">
     <xsl:attribute name="color">006d0f</xsl:attribute>
    </xsl:when>
    <xsl:when test="@status = 'Failed'">
     <xsl:attribute name="color">FF0000</xsl:attribute>
    </xsl:when>
     <xsl:when test="@status = 'Risk'">
     <xsl:attribute name="color">FF9900</xsl:attribute>
    </xsl:when>
    <!-- etc. etc. -->
  </xsl:choose>
 </task>

答案 1 :(得分:3)

更好:

<task name="{@title}"  processId="{@resourceId}" start="{@start}" end="{@end}" Id="{@id}" borderColor="E1E1E1">
  <xsl:attribute name="color">
   <xsl:choose>
    <xsl:when test="@status = 'Completed'">006d0f</xsl:when>
    <xsl:when test="@status = 'Failed'">FF0000</xsl:when>
    <xsl:when test="@status = 'Risk'">FF9900</xsl:when>
    <!-- etc. etc. -->
  </xsl:choose>
 </xsl:attribute>
</task>