从XSL 1.0中的字母数字字符中删除前导零?

时间:2013-11-08 08:07:48

标签: xml xslt xslt-1.0

我收到了像00000BE0891.116.828这样的输入。我必须从中删除点和前导零。我尝试使用translate()函数删除了它的点。

然后我尝试string(number(00000BE0891.116.828)),但它返回NaN,因为number()函数不验证字母表。有没有人有任何建议?

2 个答案:

答案 0 :(得分:6)

一种方法可能是使用translate删除所有零,然后将告诉您第一个非零字符是什么。然后,您可以使用 substring-after 以这种方式切断前导零。

<xsl:variable name="firstNonZero" 
              select="substring(translate($number, '0', ''), 1, 1)" />
<xsl:variable name="noLeadingZeroes"
              select="concat($firstNonZero, substring-after($number, $firstNonZero))" />
<xsl:value-of select="translate($noLeadingZeroes, '.', '')" />

$ number 是您的起始输入“00000BE0891.116.828”)

或者,如果你想将它组合成一个表达式......

<xsl:value-of 
    select="translate(concat(substring(translate($number, '0', ''), 1, 1), substring-after($number, substring(translate($number, '0', ''), 1, 1))), '.', '')" />

答案 1 :(得分:0)

您还可以使用translate()从字母数字值中删除前导零。例如,如果您有这样的XML:

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <value>00000BE0891.116.828</value>
</data>

你可以像这样使用XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="value">
        <xsl:copy>
            <xsl:value-of select="translate(., '^0*', '' )" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

^0*是一个正则表达式,将删除所有前导零。如果你想结合点的平移,你可以这样做:

<xsl:value-of select="translate(translate(., '^0*', ''), '.', '')" />