XSLT 2.0 - 如何将带有数字的文本格式化为数字?

时间:2017-06-15 13:14:16

标签: xml xslt xslt-2.0

我想改造 “ 0年(s),0个月(s),0天(s)”至“ 000000 ”。采用YYMMDD格式。

我试过这个,但不知道如果它们是单个数字,如何格式化它作为YYMMDD。

<xsl:value-of select="concat(normalize-space(substring-before(ns:Service,'year')),normalize-space(substring-after(substring-before(ns:Service,'month'),',')),normalize-space(substring-after(substring-before(ns:Service,'day'),'month(s),')))"/> 

所以,1年,4个月,23天转换为1423但预期值为010423.

14天(s),12个月,11天(s)正确转换为141211。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我会使用analyze-string来提取组件:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

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

    <xsl:template match="data">
        <xsl:copy>
            <xsl:variable name="numbers" as="xs:integer*">
                <xsl:analyze-string select="." regex="([0-9]+) year\(s\), ([0-9]+) month\(s\), ([0-9]+) day\(s\)">
                    <xsl:matching-substring>
                        <xsl:sequence select="xs:integer(regex-group(1)), xs:integer(regex-group(2)), xs:integer(regex-group(3))"/>
                    </xsl:matching-substring>
                </xsl:analyze-string>
            </xsl:variable>
            <xsl:value-of select="for $n in $numbers return format-number($n, '00')" separator=""/>
        </xsl:copy>

    </xsl:template>

</xsl:transform>

变换

<body>
  <data>1 year(s), 4 month(s), 23 day(s)</data>
  <data>14 year(s), 12 month(s), 11 day(s)</data>
</body>

进入

<body>
  <data>010423</data>
  <data>141211</data>
</body>

使用Saxon 9.8支持的XSLT 3.0(包括开源HE版本),您可以将其缩短为

<xsl:mode on-no-match="shallow-copy"/>

<xsl:template match="data">
    <xsl:copy>
        <xsl:value-of select="analyze-string(., '([0-9]+) year\(s\), ([0-9]+) month\(s\), ([0-9]+) day\(s\)')//*:group/format-number(xs:integer(.), '00')" separator=""/>
    </xsl:copy>
</xsl:template>

使用analyze-string函数代替xsl:analyze-string元素。