Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在XSL1.0中删除字母数字字符的前导零?_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

Xml 在XSL1.0中删除字母数字字符的前导零?

Xml 在XSL1.0中删除字母数字字符的前导零?,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我得到了一个类似于00000BE0891.116.828的输入。我必须从中删除点和前导零。我尝试了translate()函数,从中删除了点 然后我尝试了string(number(00000BE0891.116.828)),但它返回了NaN,因为number()函数不验证字母表。有人有什么建议吗?一种方法是使用translate删除所有零,然后它会告诉您第一个非零字符是什么。然后可以在之后使用子字符串以这种方式切掉前导零 <xsl:variable name="firstNonZero"

我得到了一个类似于
00000BE0891.116.828
的输入。我必须从中删除点和前导零。我尝试了
translate()
函数,从中删除了点


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

一种方法是使用translate删除所有零,然后它会告诉您第一个非零字符是什么。然后可以在之后使用子字符串以这种方式切掉前导零

<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))), '.', '')" />

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

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <value>00000BE0891.116.828</value>
</data>
<?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>

translate($number,“^0*”,”)
更容易编写。不幸的是,XLST 1.0中没有规则表达式。(在XSLT 2.0中,可以使用正则表达式的
replace
函数。我认为
translate
只使用普通字符串作为参数)。在XSLT 1.0中对其进行了测试,如下所示,
translate()
可以处理正则表达式。另请参见此处的第二个答案:在XSLT1.0或XSLT2.0中使用translate返回“BE891116828”。所有零都已删除,而不仅仅是前导零。另外,请参阅W3C规范,其中没有提到正则表达式<但是,代码>替换将是XSLT2.0中的方法。
<xsl:value-of select="translate(translate(., '^0*', ''), '.', '')" />