【问题标题】:Getting compile error while using format-date() method in XSLT在 XSLT 中使用 format-date() 方法时出现编译错误
【发布时间】:2013-03-26 14:19:16
【问题描述】:

我正在尝试使用 XSLT 2.0 版将 XML 转换为 CSV。但是在 XSLT 中使用 format-date 方法时出现编译错误。 以下是错误:

表达式'funcall(format-date, [variable-ref(dt/string), literal-expr([D01]/[M01]/[Y0001])])'的错误检查类型。
致命错误:“无法编译样式表”。

XSLT 代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"       xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:func="http://exslt.org/functions" xmlns:date="http://exslt.org/dates-and-times"
            extension-element-prefixes="date" date:doc="http://www.exslt.org/date">

<xsl:output method="text"/>

<xsl:template match="/">    
<xsl:variable name="dt" select="'2013-04-04'"/>
<xsl:value-of select="format-date($dt, '[D01]/[M01]/[Y0001]')" />  
<xsl:value-of select="format-date(current-date(), '[D01]/[M01]/[Y0001]')" />               

</xsl:template>
</xsl:stylesheet>

【问题讨论】:

    标签: xslt compiler-errors formatdatetime


    【解决方案1】:

    您的变量 $dt 是一个字符串,而不是日期。您需要先使用 xs:date('2013-04-04') 将其转换为日期,然后才能对其进行格式化。

    【讨论】:

    • 即使将其转换为日期后也会出现相同的错误,当我使用“current-date()”时也会出现相同的错误。我不确定我是否遗漏了什么。当我尝试在 XSLT 中使用日期函数时出现此编译错误。如果没有日期函数,我的 XSL 代码可以正常工作。我正在使用 2.0 版
    • 可能您使用的不是 2.0 版。有时人们想象在样式表中只写 version="2.0" 会自动将 XSLT 处理器变成 2.0 处理器。您如何进行转型?
    • 我正在使用带有 java 代码的“javax.xml.transform”转换器。我想将从“System.currentTimeMillis()”方法返回的日期时间转换为用户可读的格式,例如“MM/dd/yyyy hh:mm:ss a”。从“System.currentTimeMillis()”返回的值(例如:1364969832764)被写入 XML,然后我试图通过 XSLT 将其转换为日期时间格式。
    • 执行&lt;xsl:comment&gt;&lt;xsl:value-of select="system-property('xsl:version')"/&gt;&lt;/xsl:comment&gt; 之类的操作来检查您的 XSLT 处理器。您可能正在使用内置处理器,即 XSLT 1.0,并且需要将 Saxon 放在类路径中。
    • 我试过这个并确定我正在使用 XSLT 1.0。我可以下载 saxson9he.jar 并通过命令行在 XSLT 2.0 中运行 format-date 方法。但是当我尝试使用 Eclipse 时,我收到错误消息:“javax.xml.transform.TransformerFactoryConfigurationError: Provider net.sf.saxon.TransformerFactoryImpl not found”。您能否让我知道如何在使用 eclipse 和 JAVA 以及项目被 mavenized 时使用 saxon。我在 POM 中添加了依赖项并使用 tSystem.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl"); 更新了代码;
    【解决方案2】:

    这对我有用(使用撒克逊语):

    <xsl:variable name="dt">2013-04-04</xsl:variable>
    

    【讨论】:

    • 之所以起作用是因为该变量是一个XML文档节点,它被原子化以创建一个untypedAtomic值,并且一个untypedAtomic值在传递给函数时会自动转换为所需的类型(xs:日期)。无论多么方便,这是实现目标的迂回和低效的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2019-02-18
    • 1970-01-01
    相关资源
    最近更新 更多