需要从输入前减少 20 天 xml
Need to reduce the 20 days prior from the input xml
需要从输入 xml 元素中获取前 20 天。
输入xml我有(年-月-日):
<section>
<Plans>
<Date>2022-01-01</Date>
</Plans>
</section>
<p>20 days back date: <keyword keyref="Cost:Date:date4"/></p>
我正在使用 XSL
<xsl:template match="keyword[contains(@keyref, 'Cost:Date:date4')]">
<xsl:param name="section" as="element()" tunnel="yes">
<empty/>
</xsl:param>
<keyword keyref="Cost:Date:date4">
<xsl:call-template name="format_variable">
<xsl:with-param name="cur_keyref" select="@keyref"/>
<xsl:with-param name="cur_value"
select="$section//Plans/Date"/>
<xsl:with-param name="cur_format" select="'date4'"/>
</xsl:call-template>
</keyword>
</xsl:template>
<xsl:template name="format_variable">
<xsl:param name="cur_keyref" as="xs:string">MISSING</xsl:param>
<xsl:param name="cur_value" as="xs:string">MISSING</xsl:param>
<xsl:param name="cur_format" as="xs:string">MISSING</xsl:param>
<xsl:choose>
<xsl:when test="$cur_format = 'date4'">
<xsl:variable name="format" select="replace($cur_value, '(.{4})-(.{2})-(.{2})', '//')"/>
<xsl:value-of select="$format - xs:dateTime('P20D')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select="concat('MISSING_FORMAT_', $cur_keyref, '_', $cur_value, '_[', $cur_format, ']')"
/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
当我尝试上面的代码时,它显示以下错误:
Invalid dateTime value "P20D" (Non-numeric year component)
预期输出为:
20 days back date: 12/12/2021
我认为您想减去 dayTimeDuration,例如<xsl:value-of select="$format - xs:dayTimeDuration('P20D')"/>
.
FWIW,我相信你把它复杂化了。输入XML中的日期格式为YYYY-MM-DD;您需要做的就是从给定日期减去 20 天的持续时间 - 请在此处查看演示:https://xsltfiddle.liberty-development.net/6qaCymJ
需要从输入 xml 元素中获取前 20 天。
输入xml我有(年-月-日):
<section>
<Plans>
<Date>2022-01-01</Date>
</Plans>
</section>
<p>20 days back date: <keyword keyref="Cost:Date:date4"/></p>
我正在使用 XSL
<xsl:template match="keyword[contains(@keyref, 'Cost:Date:date4')]">
<xsl:param name="section" as="element()" tunnel="yes">
<empty/>
</xsl:param>
<keyword keyref="Cost:Date:date4">
<xsl:call-template name="format_variable">
<xsl:with-param name="cur_keyref" select="@keyref"/>
<xsl:with-param name="cur_value"
select="$section//Plans/Date"/>
<xsl:with-param name="cur_format" select="'date4'"/>
</xsl:call-template>
</keyword>
</xsl:template>
<xsl:template name="format_variable">
<xsl:param name="cur_keyref" as="xs:string">MISSING</xsl:param>
<xsl:param name="cur_value" as="xs:string">MISSING</xsl:param>
<xsl:param name="cur_format" as="xs:string">MISSING</xsl:param>
<xsl:choose>
<xsl:when test="$cur_format = 'date4'">
<xsl:variable name="format" select="replace($cur_value, '(.{4})-(.{2})-(.{2})', '//')"/>
<xsl:value-of select="$format - xs:dateTime('P20D')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select="concat('MISSING_FORMAT_', $cur_keyref, '_', $cur_value, '_[', $cur_format, ']')"
/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
当我尝试上面的代码时,它显示以下错误:
Invalid dateTime value "P20D" (Non-numeric year component)
预期输出为:
20 days back date: 12/12/2021
我认为您想减去 dayTimeDuration,例如<xsl:value-of select="$format - xs:dayTimeDuration('P20D')"/>
.
FWIW,我相信你把它复杂化了。输入XML中的日期格式为YYYY-MM-DD;您需要做的就是从给定日期减去 20 天的持续时间 - 请在此处查看演示:https://xsltfiddle.liberty-development.net/6qaCymJ