我正在尝试画一个饼图而我只是从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 > 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;我曾经试图放置空间,但都没有工作。还有其他建议吗?
答案 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 > 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在评论中所推荐的那样)......