2010-08-04 55 views
3

我使用一些代码从另一个使用XSLT 2.0减去一个日期:如何将XSLT 2.0日期持续时间转换为字符串?

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

这工作,但它给我留下了P2243D的答案,我假设对应于一个“2243天的时期”(这在数学上是正确的)。

因为我只需要天数,而不是P和D,我知道我可以使用substring或类似的东西,但作为XSLT的新手,我很好奇,如果有更好,更优雅的方式要做到这一点比简单的字符串操作。

回答

7

你可以简单地使用fn:days-from-duration()得到持续时间为xs:integer

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

返回一个xs:integer代表的$arg值的规范词法表示的日子组件。结果可能是负面的。

有关更多信息,请参阅XQuery 1.0 and XPath 2.0 Functions and Operators规范。

你的情况:

<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> 
+0

+1好,延长答复!也用于链接规格。 – 2010-08-04 14:16:34

+0

可爱的答案,非常感谢。现在,如果我能弄清楚我的下一个问题:下次如何回答这个问题... – mlissner 2010-08-04 16:16:05

相关问题