我想改造 “ 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。感谢您的帮助。
答案 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
元素。