Xml 从年月日到年月日的XSLT日期转换
我正在使用XSLT1.0,需要将日期格式从dd/mm/yyyy转换为月份yyyy,例如2011年1月 有人能提供一个样本吗?我可以找到XSLT2.0的示例,但我使用的是1.0 谢谢, 科林。使用:Xml 从年月日到年月日的XSLT日期转换,xml,xslt,xpath,xslt-1.0,Xml,Xslt,Xpath,Xslt 1.0,我正在使用XSLT1.0,需要将日期格式从dd/mm/yyyy转换为月份yyyy,例如2011年1月 有人能提供一个样本吗?我可以找到XSLT2.0的示例,但我使用的是1.0 谢谢, 科林。使用: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="metadata"> <xsl:output method="tex
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="metadata">
<xsl:output method="text"/>
<ext:months>
<month>January</month>
<month>February</month>
<month>March</month>
<month>April</month>
<month>May</month>
<month>June</month>
<month>July</month>
<month>August</month>
<month>September</month>
<month>October</month>
<month>November</month>
<month>December</month>
</ext:months>
<xsl:variable name="date">23/02/2012</xsl:variable>
<xsl:template match="/">
<xsl:value-of select="concat(document('')
//month[number(substring($date, 4, 2))],
' ',
substring($date, 7, 4))"/>
</xsl:template>
</xsl:stylesheet>
一月
二月
前进
四月
也许
六月
七月
八月
九月
十月
十一月
十二月
23/02/2012
很明显,单独使用XSLT 1.0是不可能的。。对于类似的问题,我建议编写脚本。。(C#)
示例XML:
<?xml version="1.0" encoding="utf-8"?>
<root>
<date>02/10/2012</date>
<date>2/9/2012</date>
</root>
02/10/2012
2/9/2012
示例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[
private static string[] formats = new string[]
{
"dd/MM/yyyy",
"dd/M/yyyy",
"d/M/yyyy",
"d/MM/yyyy",
"dd/MM/yy",
"dd/M/yy",
"d/M/yy",
"d/MM/yy"
};
public string date_conv(string date1)
{
DateTime dDateTime;
DateTime.TryParseExact(date1, formats, new global::System.Globalization.CultureInfo("en-US"), global::System.Globalization.DateTimeStyles.None, out dDateTime);
return(String.Format("{0:MMMM yyyy}", dDateTime));
}
]]>
</msxsl:script>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="date">
<xsl:copy>
<xsl:value-of select="cs:date_conv(.)"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
结果输出:
<?xml version="1.0" encoding="utf-8"?>
<root>
<date>October 2012</date>
<date>September 2012</date>
</root>
2012年10月
2012年9月
脚本可能驻留在同一个文件中(就像我在示例XSLT代码中使用的一样),或者如果触发XSLTransformation的代码是C,则将相同的代码移到调用位置:)我更喜欢Kirill的答案,但这里有一个不使用
document()
:
XML输入
<doc>
<date>01/01/2012</date>
<date>01/02/2011</date>
<date>01/03/2010</date>
<date>01/04/2009</date>
</doc>
<doc>
<date>January 2012</date>
<date>February 2011</date>
<date>March 2010</date>
<date>April 2009</date>
</doc>
01/01/2012
01/02/2011
01/03/2010
01/04/2009
XSLT1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="date">
<xsl:variable name="month">
<xsl:call-template name="getMonth">
<xsl:with-param name="monthNbr" select="number(substring-before(substring-after(.,'/'),'/'))"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="year">
<xsl:call-template name="getYear">
<xsl:with-param name="date" select="."/>
</xsl:call-template>
</xsl:variable>
<date><xsl:value-of select="concat($month,' ',$year)"/></date>
</xsl:template>
<xsl:template name="getMonth">
<xsl:param name="monthNbr"/>
<xsl:choose>
<xsl:when test="$monthNbr=1">January</xsl:when>
<xsl:when test="$monthNbr=2">February</xsl:when>
<xsl:when test="$monthNbr=3">March</xsl:when>
<xsl:when test="$monthNbr=4">April</xsl:when>
<xsl:when test="$monthNbr=5">May</xsl:when>
<xsl:when test="$monthNbr=6">June</xsl:when>
<xsl:when test="$monthNbr=7">July</xsl:when>
<xsl:when test="$monthNbr=8">August</xsl:when>
<xsl:when test="$monthNbr=9">September</xsl:when>
<xsl:when test="$monthNbr=10">October</xsl:when>
<xsl:when test="$monthNbr=11">November</xsl:when>
<xsl:when test="$monthNbr=12">December</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="getYear">
<xsl:param name="date"/>
<xsl:variable name="year" select="substring-after($date,'/')"/>
<xsl:choose>
<xsl:when test="contains($year,'/')">
<xsl:call-template name="getYear">
<xsl:with-param name="date" select="$year"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$year"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
一月
二月
前进
四月
也许
六月
七月
八月
九月
十月
十一月
十二月
XML输出
<doc>
<date>01/01/2012</date>
<date>01/02/2011</date>
<date>01/03/2010</date>
<date>01/04/2009</date>
</doc>
<doc>
<date>January 2012</date>
<date>February 2011</date>
<date>March 2010</date>
<date>April 2009</date>
</doc>
2012年1月
2011年2月
2010年3月
2009年4月
另外,我使用了年度模板而不是
substring()
来处理没有前导零的月/日。,包含XSLT 1.0感谢响应。我现在得到一个错误:“document()”函数的执行被禁止。使用XsltSettings.enabledDocumentFunction属性来启用它。我无法修改xslt的读写方式,如何绕过文档(“”)声明?@ColinBrown,如果您无法修改xslt处理器的执行方式,您可以像@DevNull建议的那样使用
。“显然单独使用xslt 1.0是不可能的”@DevNull,:)我假设日期是上述格式的。。此代码使用tryparse方法,该方法可以将其摘要并转换为所需格式。。其中,您的方法只能读取“dd/MM/yyyy”。。我收回我的话!“不可能”不是一个很好的选择:)谢谢,您介意解释一下如何从现有xslt文件中调用该函数吗?我给了模板一个名称“date”,并尝试了这个方法,但它不起作用:
@ColinBrown-什么是“不起作用”的意思?你有错误吗?你有什么收获吗?p:StartDate
是您执行调用模板的上下文的直接子级吗?另外,我的解决方案中有两个命名模板;您在XSLT中添加了哪个模板?您好,我说的不工作是指它返回空白,没有错误。我给下面一行起了名字“date”
-我想这是对的?我假设您将
更改为
,并且您添加了
,以便可以将实际日期的值传递给它。如果这是真的,那么问题很可能是您没有从
获得值。您可以尝试向模板添加xsl:message
,以查看传递的内容。类似于参数“string”的值为“.”
。