通过输入舍入所有数值的XSL解析

时间:2017-04-10 14:48:12

标签: xml xslt xslt-1.0

我需要解析一个文档并删除每个标记的所有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>

2 个答案:

答案 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>