Java 属性的XSLT格式日期
我目前正在使用以下xsltJava 属性的XSLT格式日期,java,xml,xslt,formatdatetime,Java,Xml,Xslt,Formatdatetime,我目前正在使用以下xslt input format YYYY-MM-DDTHH:MM:SSZ output format YYYY-MM-DD HH:MM:SS 但是,当我调试转换xslt时,它似乎没有进入formatdate调用模板。我的xpath错了吗?我找到了关于修改节点的文章,但没有找到属性。任何帮助都将不胜感激 谢谢试试这个 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0"
input format YYYY-MM-DDTHH:MM:SSZ
output format YYYY-MM-DD HH:MM:SS
但是,当我调试转换xslt时,它似乎没有进入formatdate调用模板。我的xpath错了吗?我找到了关于修改节点的文章,但没有找到属性。任何帮助都将不胜感激
谢谢试试这个
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<!-- Edit dates to conform to dbunit format-->
<xsl:template match="@created_at">
<xsl:copy>
<xsl:call-template name="formatdate">
<xsl:with-param name="datestr" select="@created_at"/>
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template name="formatdate">
<xsl:param name="datestr" />
<!-- input format YYYY-MM-DDTHH:MM:SSZ -->
<!-- output format YYYY-MM-DD HH:MM:SS -->
<xsl:variable name="datetext">
<xsl:value-of select="substring-before($datestr,'T')" />
</xsl:variable>
<xsl:variable name="timetext">
<xsl:value-of select="substring($datestr,12,18)" />
</xsl:variable>
<xsl:value-of select="concat($datetext, ' ', $timetext)" />
</xsl:template>
</xsl:stylesheet>
试试这个
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<!-- Edit dates to conform to dbunit format-->
<xsl:template match="@created_at">
<xsl:copy>
<xsl:call-template name="formatdate">
<xsl:with-param name="datestr" select="@created_at"/>
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template name="formatdate">
<xsl:param name="datestr" />
<!-- input format YYYY-MM-DDTHH:MM:SSZ -->
<!-- output format YYYY-MM-DD HH:MM:SS -->
<xsl:variable name="datetext">
<xsl:value-of select="substring-before($datestr,'T')" />
</xsl:variable>
<xsl:variable name="timetext">
<xsl:value-of select="substring($datestr,12,18)" />
</xsl:variable>
<xsl:value-of select="concat($datetext, ' ', $timetext)" />
</xsl:template>
</xsl:stylesheet>
为什么不简单地:
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='xml' indent='yes'/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<!-- Edit dates to conform to dbunit format-->
<xsl:template match="@created_at">
<xsl:call-template name="formatdate">
<xsl:with-param name="datestr" select="."/>
</xsl:call-template>
</xsl:template>
<xsl:template name="formatdate">
<xsl:param name="datestr" />
<!-- input format YYYY-MM-DDTHH:MM:SSZ -->
<!-- output format YYYY-MM-DD HH:MM:SS -->
<xsl:variable name="datetext">
<xsl:value-of select="substring-before($datestr,'T')" />
</xsl:variable>
<xsl:variable name="timetext">
<xsl:value-of select="substring($datestr,12,8)" />
</xsl:variable>
<xsl:attribute name="created_at">
<xsl:value-of select="concat($datetext, ' ', $timetext)" />
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
注意:如果要更改属性的值,则不能使用
xsl:copy
。为什么不简单地:
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='xml' indent='yes'/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<!-- Edit dates to conform to dbunit format-->
<xsl:template match="@created_at">
<xsl:call-template name="formatdate">
<xsl:with-param name="datestr" select="."/>
</xsl:call-template>
</xsl:template>
<xsl:template name="formatdate">
<xsl:param name="datestr" />
<!-- input format YYYY-MM-DDTHH:MM:SSZ -->
<!-- output format YYYY-MM-DD HH:MM:SS -->
<xsl:variable name="datetext">
<xsl:value-of select="substring-before($datestr,'T')" />
</xsl:variable>
<xsl:variable name="timetext">
<xsl:value-of select="substring($datestr,12,8)" />
</xsl:variable>
<xsl:attribute name="created_at">
<xsl:value-of select="concat($datetext, ' ', $timetext)" />
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
注意:如果要更改属性的值,则不能使用xsl:copy。从您的帖子中,听起来您只需要简单的字符串处理 为什么你的代码没有按你想要的方式工作 您正在使用此模板处理在处创建的属性:
这里的关键是你正在使用
。与属性一起使用时,
复制整个属性、名称和值。由于属性不能包含任何子项,因此
指令的子项将被忽略——因此XSLT处理器从不计算
指令
另一种有效的方法
您需要使用
来创建属性,而不是使用
,这样您还可以指定值。在本例中,您已经知道要创建的属性的名称,因此可以将名称值硬编码为created\u at
。对于更灵活的方法,您可以改为将name值指定为{name(.)}
——这只是获取正在处理的属性的名称,这在行为上更接近您可能认为的
。)
也可以在一个xsl:value of
表达式中生成所需的字符串,而无需依赖太多变量
分解选择语句:
- 使用
concat()
将多个字符串位缝合在一起
- 使用(,'T')
之前的子字符串抓取T
之前的所有内容——这是日期部分
<代码> '/Cult>在中间添加单个空间。
前面的子字符串(后面的子字符串(,'T'),'Z')
--
- (,'T')之后的内部表达式
子字符串
获取T
之后的所有内容,这就是时间部分
- 但是,结尾有一个讨厌的
Z
,所以我们使用子字符串作为外部表达式来删除它
不需要变量,它就能完成任务。确认使用XSLT 1.0。从您的帖子中,听起来您只需要简单的字符串处理
为什么你的代码没有按你想要的方式工作
您正在使用此模板处理在
处创建的属性:
这里的关键是你正在使用
。与属性一起使用时,
复制整个属性、名称和值。由于属性不能包含任何子项,因此
指令的子项将被忽略——因此XSLT处理器从不计算
指令
另一种有效的方法
您需要使用
来创建属性,而不是使用
,这样您还可以指定值。在本例中,您已经知道要创建的属性的名称,因此可以将名称值硬编码为created\u at
。对于更灵活的方法,您可以改为将name值指定为{name(.)}
——这只是获取正在处理的属性的名称,这在行为上更接近您可能认为的
。)
也可以在一个xsl:value of
表达式中生成所需的字符串,而无需依赖太多变量
分解选择语句:
- 使用
concat()
将多个字符串位缝合在一起
- 使用(,'T')
之前的子字符串抓取T
之前的所有内容——这是日期部分
<代码> '/Cult>在中间添加单个空间。
前面的子字符串(后面的子字符串(,'T'),'Z')
--
- (,'T')之后的内部表达式
子字符串
获取T
之后的所有内容,这就是时间部分
- 但是,结尾有一个讨厌的
Z
,所以我们使用子字符串作为外部表达式来删除它
不需要变量,它就能完成任务。已确认可以使用XSLT 1.0。成功!谢谢你的工作!谢谢你假设时区总是Z
@michael.hor257k:确实如此。基于他人发布的内容创建示例时,始终需要某种假设。我可以把你的陈述反过来说,你假设日期时间总是19个字符长我们都是根据我们面前的情况做出假设的。FWIW,我喜欢你使用的翻译
:非常优雅。我还认为我的方法作为字符串搜索的另一个例子很有用