Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 属性的XSLT格式日期_Java_Xml_Xslt_Formatdatetime - Fatal编程技术网

Java 属性的XSLT格式日期

Java 属性的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"

我目前正在使用以下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" 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,我喜欢你使用的
    翻译
    :非常优雅。我还认为我的方法作为字符串搜索的另一个例子很有用