XSLT / SVG - 选择Statement拧紧我的模板

时间:2014-07-21 20:44:29

标签: xml xslt svg

我正在尝试画一个饼图而我只是从1片开始。我正在尝试使用SVG的路径来执行此操作,因此我必须根据数据计算要绘制的点。我的问题是,有一个数字取决于我的值的角度是否大于3.14。

XML文件:

<RESULTS>
 <ROW>
   <PASSED>2267</PASSED>
   <FAILED>30</FAILED>
   <CAUTION>11</CAUTION>
   <BLOCKED>10</BLOCKED>
   <NOTRUN>773</NOTRUN>
   <TOTAL>3091</TOTAL>
 </ROW>
</RESULTS>

带选择语句的XSLT:

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     xmlns="http://www.w3.org/2000/svg">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/RESULTS">
     <svg width="900" height="400">

     <xsl:for-each select="ROW">

    <xsl:variable name="currentAngle"
          select="((PASSED div TOTAL * 360.0) * .0174532925)"/>    

    <path style="fill:#ff0000;stroke:black;stroke-width:1">
          <xsl:attribute name="d">
               <xsl:text>M200, 200 L200, 20 A180, 180 0</xsl:text> 
               <xsl:text> </xsl:text>
               <xsl:choose>
                     <xsl:when test="$currentAngle &gt; 3.14"> 
                          <xsl:text>1 </xsl:text>
                     </xsl:when>
                     <xsl:otherwise>
                          <xsl:text>0 </xsl:text>
                     </xsl:otherwise>
                </xsl:choose>
                <xsl:text>,1 </xsl:text>
            <xsl:text> </xsl:text>
            <xsl:value-of select="200 - ((1 - (($currentAngle * $currentAngle) div 2) + (($currentAngle * $currentAngle * $currentAngle * $currentAngle) div 24) - (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle  * $currentAngle) div 720) + (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle) div 40320)) * 180)"/>
                <xsl:text>,</xsl:text>
            <xsl:value-of select="200 - (($currentAngle - (($currentAngle * $currentAngle * $currentAngle) div 6) + (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle) div 120) - (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle) div 5040) + (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle) div 362880)) * 180)"/>
           <xsl:text> </xsl:text>
           <xsl:text> Z</xsl:text>
           </xsl:attribute>
    </path>

     </xsl:for-each>
     </svg>
</xsl:template>
</xsl:stylesheet>

如果我替换了select语句并只输入了所需的数字,那么它将起作用。但是,我不会总是知道我需要在哪个号码中放置,因此选择声明是必不可少的:

<path style="fill:#ff0000;stroke:black;stroke-width:1">
      <xsl:attribute name="d">
        <xsl:text>M200, 200 L200, 20 A180, 180 0 1,</xsl:text> 
        <xsl:text> </xsl:text>
        <xsl:text>1 </xsl:text>
        <xsl:text> </xsl:text>
        <xsl:value-of select="200 - ((1 - (($currentAngle * $currentAngle) div 2) + (($currentAngle * $currentAngle * $currentAngle * $currentAngle) div 24) - (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle  * $currentAngle) div 720) + (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle) div 40320)) * 180)"/>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="200 - (($currentAngle - (($currentAngle * $currentAngle * $currentAngle) div 6) + (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle) div 120) - (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle) div 5040) + (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle) div 362880)) * 180)"/>
             <xsl:text> </xsl:text>
             <xsl:text> Z</xsl:text>
           </xsl:attribute>
  </path>

带有choose语句的输出只是一条直线向上和向下的输出,并没有将弧完成到路径的一部分。第二个完成了馅饼切片。为什么要跳过choose语句以及如何修复它以便我可以生成饼图?

编辑:

它没有跳过choose语句,但它没有识别我正在介入的空间。例如,我的输出可能如下所示:

<path d="M200, 200 L200, 20 A 180, 180 00, 1236, 23">

而不是:

<path d="M200, 200 L200, 20 A 180, 180 0 0, 1 236, 23">

我尝试在文本之间使用4个空格并试图使用&amp;#160;我曾经试图放置空间,但都没有工作。还有其他建议吗?

1 个答案:

答案 0 :(得分:2)

根据您的编辑,显然问题是通过

添加的空白
    <xsl:text> </xsl:text>

正在崩溃。

您可以尝试使用XSLT whitespace settings。但是,更简单的修复只是用逗号替换空格,逗号对于分隔路径命令中的所有数字有效,而不仅仅是坐标对。您也可以在现有文本块的末尾添加逗号以减少元素数量:

      <xsl:attribute name="d">
         <xsl:text>M200, 200 L200, 20 A180, 180 0,</xsl:text> 
         <xsl:choose>
                 <xsl:when test="$currentAngle &gt; 3.14"> 
                      <xsl:text>1,</xsl:text>
                 </xsl:when>
                 <xsl:otherwise>
                      <xsl:text>0,</xsl:text>
                 </xsl:otherwise>
         </xsl:choose>
         <xsl:text>1,</xsl:text>
         <xsl:value-of select="200 - ((1 - (($currentAngle * $currentAngle) div 2) + (($currentAngle * $currentAngle * $currentAngle * $currentAngle) div 24) - (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle  * $currentAngle) div 720) + (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle) div 40320)) * 180)"/>
         <xsl:text>,</xsl:text>
         <xsl:value-of select="200 - (($currentAngle - (($currentAngle * $currentAngle * $currentAngle) div 6) + (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle) div 120) - (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle) div 5040) + (($currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle * $currentAngle) div 362880)) * 180)"/>
         <xsl:text>Z</xsl:text>
      </xsl:attribute>

我会让你为你的三角近似找出一个更紧凑的符号(正如@Tomalak在评论中所推荐的那样)......