使用XSLT格式化日期(字符串)

凯文·安德森

关于这个特定主题有很多问题/答案,但似乎都没有解决我遇到的特定问题。我也是一个完全菜鸟,所以是;-)。我将以下XML从应用程序发送到一块中间件。在该中间件中,我正在捕获XML并提取数据。我剩下的最后一个挑战是重新格式化位于<now></now>标签内的代表日期的字符串数据

<?xml version="1.0" encoding="UTF-8"?>
    <Body>
        <send_message xmlns="urn:xyztech:agent">
            <user>
                <now>2017-11-15T13:38:11+00:00</now>
                <company>xyz.demo</company>
            </user>
        </send_message>
    </Body>

我正在使用Apigee作为中间件,并且需要一个XSL脚本来操纵日期(使日期更整洁-类似于2017年11月15日或2017年11月15日,而我不需要时间)。我已经尝试了几个例子,但似乎没有一个适合我。不幸的是,作为菜鸟,我真的无法调试这些示例中发生的错误(例如,无法从名称空间引用中找到函数),并且我非常感谢您的帮助/指导。

如果我可以使用提取数据的XSL中已经拥有的XPath,那将是一件很漂亮的事情:

<Variable name="now" type="date">
    <XPath>//Envelope/Body/send_message/user/now</XPath>
</Variable>

我已经看到了解决方案,但是我感觉Apigee不支持XPath 2.0,因此format-date($d,"[D]-[M]-[Y]")也不是可行的选择。感谢所有/所有帮助...

凯文·安德森

答案(完整解决方案)采用了上面提到的Christian Mosz和valdi_bo的一些建议,以及@friedemann_bach(来自我提出的另一个问题)的最终极有帮助的解决方案和解释(这是我需要的完整XSL):

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:ms="urn:schemas-microsoft-com:xslt">

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="now">
  <now>
    <xsl:variable name="srcDateTime" select="//Envelope/Body/send_message/user/now"/>
    <xsl:variable name="srcDate" select="substring-before($srcDateTime, 'T')" />
    <xsl:variable name="outDate" select="format-date(xs:date($srcDate),'[D01].[M01].[Y0001]')"/>
    <xsl:value-of select="$outDate" disable-output-escaping="yes"/>
  </now>
</xsl:template>
</xsl:stylesheet>

尽管这里的前两个答案提供了日期格式的解决方案,但是我接下来要解决的问题是不理解为什么所有其他标签都被撕掉了。第一个(其他)模板修复了该问题(它没有任何变化,因此第二个模板仅在我在第二个模板中选择的节点上覆盖了“无变化”。非常感谢大家的帮助。)我必须要有完整的解决方案和说明,我知道这有点“请为我做”,但这全都增加了知识,这很重要,再次感谢。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章