如何将 XSLT 2.0 日期持续时间转换为字符串?

发布于 2024-09-12 18:06:56 字数 344 浏览 4 评论 0原文

我正在使用一些代码使用 XSLT 2.0 从另一个日期中减去一个日期:

<xsl:template match="moveInDate">
    <xsl:value-of select="current-date() - xs:date(.)"/>
</xsl:template>

这可行,但是它给我留下了 P2243D 的答案,我认为它对应于“2243 天的周期”(即数学上正确)。

由于我只需要天数,而不是 P 和 D,我知道我可以使用子字符串或类似的东西,但作为 XSLT 的新手,我很好奇是否有更好、更优雅的方法来做到这一点简单的字符串操作。

I am using some code to subtract one date from another using XSLT 2.0:

<xsl:template match="moveInDate">
    <xsl:value-of select="current-date() - xs:date(.)"/>
</xsl:template>

This works, however it leaves me with an answer of P2243D, which I assume corresponds to a "Period of 2243 Days" (which is correct in terms of the math).

Since I only need the number of days, not the P and the D, I know I could use substring or something similar, but as a newbie to XSLT, I'm curious if there is a better, more elegant way to do this than simple string manipulation.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

遮了一弯 2024-09-19 18:06:56

您可以简单地使用 fn:days-from-duration() 来获取 xs:integer 形式的持续时间:

days-from-duration($arg as xs:duration?) as xs:integer?

返回一个 xs:integer,表示 $arg 值的规范词汇表示形式中的天数部分。结果可能是否定的。

请参阅XQuery 1.0 和 XPath 2.0 函数和运算符规范以获取更多信息。

对于您的情况:

<xsl:template match="moveInDate">
    <xsl:value-of select="days-from-duration(current-date() - xs:date(.))"/>
</xsl:template>

希望这有帮助!

编辑:您也可以按照您所说的方式进行子字符串处理。但正如您所指出的,这不是首选。如果您出于某种原因想做类似的事情,您需要考虑数据类型。 current-date() - xs:date(.) 的结果作为 xs:duration 返回,如果不进行强制转换,子字符串函数就无法对其进行处理:

<xsl:template match="moveInDate">
  <xsl:variable name="dur" select="(current-date() - xs:date(.)) cast as xs:string"/>
  <xsl:value-of select="substring-before(substring-after($dur, 'P'), 'D')"/>
</xsl:template>

You could simply use fn:days-from-duration() to get the duration as a xs:integer:

days-from-duration($arg as xs:duration?) as xs:integer?

Returns an xs:integer representing the days component in the canonical lexical representation of the value of $arg. The result may be negative.

See the XQuery 1.0 and XPath 2.0 Functions and Operators specification for more information.

In your case:

<xsl:template match="moveInDate">
    <xsl:value-of select="days-from-duration(current-date() - xs:date(.))"/>
</xsl:template>

Hope this helps!

EDIT: You could also do it the way you say, with substring processing. But as you point out, it's not prefered. If you for some reason would like to do something similar you need to think of the data types. The result of current-date() - xs:date(.) is returned as xs:duration which cannot be processed by the substring functions without being casted:

<xsl:template match="moveInDate">
  <xsl:variable name="dur" select="(current-date() - xs:date(.)) cast as xs:string"/>
  <xsl:value-of select="substring-before(substring-after($dur, 'P'), 'D')"/>
</xsl:template>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文