XSLT - 数字验证
XSLT - Number validation
我正在使用 xslt 进行 html 到 xml 的转换,输入 html 我有这样的表,
<doc>
<table>
<tbody>
<tr>
<td rowspan="3">aaa</td>
<td colspan="5">bbb</td>
<td rowspan="3">ccc</td>
<td colspan="2">ddd</td>
</tr>
</tbody>
</table>
</doc>
使用 xslt 我需要生成以下输出,
<doc>
<table>
<tbody>
<tr>
<entry namest="1" morerows="2">aaa</entry>
<entry namest="2" nameend="6">bbb</entry>
<entry namest="7" morerows="2">ccc</entry>
<entry namest="8" nameend="9">ddd</entry>
</tr>
</tbody>
</table>
</doc>
为了完成这个任务,我编写了以下 xsl
<xsl:template match="td">
<xsl:variable name="pre_rowspan" select="count(preceding-sibling::td[@rowspan])+1"/>
<xsl:variable name="pre_colspan" select="preceding-sibling::td[@colspan]/@colspan"/>
<xsl:variable name="numberof_pre_rowspan" select="count(preceding-sibling::td[@rowspan])+1"/>
<entry>
<xsl:attribute name="namest" select="number($pre_rowspan + $pre_colspan)"/>
<xsl:if test="@rowspan">
<xsl:attribute name="morerows" select="number(@rowspan)-1"/>
</xsl:if>
<xsl:if test="@colspan">
<xsl:attribute name="nameend"
select="number(@colspan)+count(preceding-sibling::td[@rowspan])+number(preceding-sibling::td[@colspan]/@colspan)"
/>
</xsl:if>
<xsl:apply-templates/>
</entry>
</xsl:template>
这给了我正确的输出结构,但问题是当一些数值为空时它显示 NaN
个属性。
我的输出如下,
<doc>
<table>
<tbody>
<tr>
<entry namest="NaN" morerows="2">aaa</entry>
<entry namest="NaN" nameend="NaN">bbb</entry>
<entry namest="7" morerows="2">ccc</entry>
<entry namest="8" nameend="9">ddd</entry>
</tr>
</tbody>
</table>
</doc>
我们如何在 XSLT 和 return 0 而不是 NaN
中处理这种数字验证并获得正确的输出数字值?
我建议您使用 decimal-format
来指定 NaN 掩码:
<xsl:decimal-format name = "myformat" NaN = "0"/>
<xsl:template match="td">
...
<xsl:attribute name="namest" select="format-number(number($pre_rowspan + $pre_colspan), '#0', 'myformat')"/>
...
</xsl:template>
我正在使用 xslt 进行 html 到 xml 的转换,输入 html 我有这样的表,
<doc>
<table>
<tbody>
<tr>
<td rowspan="3">aaa</td>
<td colspan="5">bbb</td>
<td rowspan="3">ccc</td>
<td colspan="2">ddd</td>
</tr>
</tbody>
</table>
</doc>
使用 xslt 我需要生成以下输出,
<doc>
<table>
<tbody>
<tr>
<entry namest="1" morerows="2">aaa</entry>
<entry namest="2" nameend="6">bbb</entry>
<entry namest="7" morerows="2">ccc</entry>
<entry namest="8" nameend="9">ddd</entry>
</tr>
</tbody>
</table>
</doc>
为了完成这个任务,我编写了以下 xsl
<xsl:template match="td">
<xsl:variable name="pre_rowspan" select="count(preceding-sibling::td[@rowspan])+1"/>
<xsl:variable name="pre_colspan" select="preceding-sibling::td[@colspan]/@colspan"/>
<xsl:variable name="numberof_pre_rowspan" select="count(preceding-sibling::td[@rowspan])+1"/>
<entry>
<xsl:attribute name="namest" select="number($pre_rowspan + $pre_colspan)"/>
<xsl:if test="@rowspan">
<xsl:attribute name="morerows" select="number(@rowspan)-1"/>
</xsl:if>
<xsl:if test="@colspan">
<xsl:attribute name="nameend"
select="number(@colspan)+count(preceding-sibling::td[@rowspan])+number(preceding-sibling::td[@colspan]/@colspan)"
/>
</xsl:if>
<xsl:apply-templates/>
</entry>
</xsl:template>
这给了我正确的输出结构,但问题是当一些数值为空时它显示 NaN
个属性。
我的输出如下,
<doc>
<table>
<tbody>
<tr>
<entry namest="NaN" morerows="2">aaa</entry>
<entry namest="NaN" nameend="NaN">bbb</entry>
<entry namest="7" morerows="2">ccc</entry>
<entry namest="8" nameend="9">ddd</entry>
</tr>
</tbody>
</table>
</doc>
我们如何在 XSLT 和 return 0 而不是 NaN
中处理这种数字验证并获得正确的输出数字值?
我建议您使用 decimal-format
来指定 NaN 掩码:
<xsl:decimal-format name = "myformat" NaN = "0"/>
<xsl:template match="td">
...
<xsl:attribute name="namest" select="format-number(number($pre_rowspan + $pre_colspan), '#0', 'myformat')"/>
...
</xsl:template>