我需要解析一个文档并删除每个标记的所有0的结束小数位。结果应与输入相同,但例如将所有“10.00”转换为“10”。
以下是一些包含可能出现的结构的示例:
<Order>
<OrderId>1234567890</OrderId>
<TotalOrder>506.40</TotalOrder>
<TotalTax>17.00</TotalTax>
<Currency>XYZ</Currency>
</Order>
应该导致:
<Order>
<OrderId>1234567890</OrderId>
<TotalOrder>506.4</TotalOrder>
<TotalTax>17</TotalTax>
<Currency>XYZ</Currency>
</Order>
值得注意的是,Order的孩子可能会有所不同。因此,我的目的不是为每种可能性制作模板匹配。
到目前为止,我所做的似乎有些正确,但会产生以下结果:
<OrderId>1.23456789E9</OrderId>
<TotalOrder>506.4</TotalOrder>
<TotalTax>17</TotalTax>
到目前为止建立的Xsl:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node()">
<xsl:for-each select="node()">
<xsl:if test="string(number(node())) != 'NaN'">
<xsl:copy>
<xsl:value-of select="number(.)"/>
</xsl:copy>
</xsl:if>
</xsl:for-each>
</xsl:template>
必须符合1.0。
有什么想法吗?
最终的XSL(欢迎提出更清洁的建议):
<xsl:template match="@*|node()">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="node()">
<xsl:for-each select="node()">
<xsl:choose>
<xsl:when test="string(number(node())) != 'NaN'">
<xsl:copy>
<xsl:value-of select="format-number(., '#########0.##')"/>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:value-of select="."/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
答案 0 :(得分:0)
尝试使用此代替当前的xsl:copy
<OrderId>1234567890</OrderId>
<TotalOrder>506.4</TotalOrder>
<TotalTax>17</TotalTax>
在&#34; 0之前放入尽可能多的#。&#34;如你所愿
这样做的例子我得到了
exec bash
答案 1 :(得分:0)
我建议您先从Identity Transform开始,然后使用模板覆盖您想要更改的特定内容,例如
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- identity transform templates -->
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | comment() | processing-instruction()">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="text()">
<xsl:copy-of select="."/>
</xsl:template>
<!-- match the text nodes where the text is a number -->
<xsl:template match="text()[number(.) = number(.)]">
<xsl:value-of select="format-number(., '#########0.##')"/>
</xsl:template>
</xsl:stylesheet>