2012-02-22 231 views
9

我有一个节点中包含我的XML文件中的以下内容:XSLT 1.0获取当前日期时间

<Apple>2011-12-01T16:33:33Z</Apple>

我希望走这条线,并使用相同格式的当前日期和时间更换如图所示以上。

YYYY-MM-DDTHH:MM:SSZ

节点将被宣告为 'X'

+0

可能的重复:http://stackoverflow.com/questions/500915/format-a-date-in-xml-via-xslt – 2012-02-22 12:02:35

+0

@SivaCharan,没有它没有,他正在寻找CURRENT DATE-TIME而不是格式。 – 2012-02-22 12:09:02

+0

请参阅http://stackoverflow.com/questions/5475699/cannot-use-the-current-datetime-function-in-xslt和http://stackoverflow.com/questions/1575111/can-an-xslt-insert-该电流是最新的。如果您不能使用XSLT 2.0,请使用脚本功能 – StuartLC 2012-02-22 12:12:19

回答

11

与播放的日期时间命名空间内是不可能单独使用XSLT 1.0。在我采取了类似的情况脚本的帮助..(C#)

示例XML:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <Apple>2011-12-01T16:33:33Z</Apple> 
</root> 

样品XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:cs="urn:cs"> 
    <xsl:output method="xml" indent="yes"/> 
    <msxsl:script language="C#" implements-prefix="cs"> 
    <![CDATA[ 
     public string datenow() 
    { 
     return(DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'")); 
    } 
    ]]> 
    </msxsl:script> 
     <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Apple"> 
     <xsl:copy> 
     <xsl:value-of select="cs:datenow()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

结果输出:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <Apple>2012-02-22T18:03:12Z</Apple> 
</root> 

脚本可以驻留在同一个文件中(像我有它在我的示例XSLT代码),或者如果触发XSLTransformation代码是C#然后将同样的代码在调用地方:)

+0

完美谢谢! – Mike 2012-02-22 14:00:23

+0

@Mike,很高兴知道:) – 2012-02-22 14:08:15

+0

我会提高解决方案,但没有足够的代表这样做:( – Mike 2012-02-22 14:20:12

6

最好从XML引擎传递当前日期时间。在您的xsl:stylesheet中声明<xsl:param name="current-datetime"/>,并传递处理器的值。

0

您最好将当前数据作为input/xsl:param传递给模板。

XSLT旨在成为纯粹的功能语言;也就是说,所有模板/功能都应符合例如以下条件:如果使用不会导致副作用的参数调用纯函数,则对于该参数列表(有时称为参照透明度),结果是常量,即如果纯函数再次使用相同参数调用,将返回相同的结果(这可以启用缓存优化,例如记忆)。

虽然有这方面的解决方法(如InfantPro'Aravind'指出),不建议做这样的事情;通过这样做,你正在破坏XSLT最重要的优势之一。