0

我的目标:我需要使用 XSL 样式表将 XML 文档中的“出生日期”元素转换为“年龄”值并生成 XHTML 页面。我正在使用 Web 浏览器(例如 IE/FF)直接打开 XML 文档。

我知道 XSLT 2.0 具有内置的日期和时间功能,但我认为目前没有浏览器支持此功能。所以,我一直在尝试使用 EXSLT 函数,但没有成功。

这是我的示例测试文件:

测试.xml

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<test>
</test>

测试.xsl

<xsl:stylesheet version="1.0"
                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                 xmlns:date="http://exslt.org/dates-and-times">
<xsl:output method="text"/>
<xsl:template match="/">
     <xsl:value-of select="date:date-time()"/>
</xsl:template>
</xsl:stylesheet>

IE8 上的错误:

Namespace 'http://exslt.org/dates-and-times' does not contain any functions. 

FF4 错误:

Error during XSLT transformation: An unknown XPath extension function was called.

这是否意味着主要 Web 浏览器不支持 EXSLT?我必须使用像 SAXON/Xalan 这样的 XSLT 处理器吗?难道我做错了什么?有替代方法吗?

4

1 回答 1

0

使用 EXSLT 支持矩阵作为参考:

以下 XSLT 处理器支持 date:date-time:

SAXON from Michael Kay (version 6.4.2)
Xalan-J from Apache (version 2.4.D1)
4XSLT, from 4Suite. (version 0.12.0a3)
libxslt from Daniel Veillard et al. (version 1.0.19)

libxslt由 Chrome、Opera 和 Safari 使用,但date-time()由于 EXSLT 被禁用而无法工作:

我认为零碎添加功能没有意义。近 5 年后,是否仍有任何东西阻止 libexslt 包含在构建中并从 XSLTExtensions.cpp 中的 registerXSLTExtensions() 调用 exsltRegisterAll()?

IE 使用MSXML,它具有以下支持:

MSXML4 提供了两个很好的扩展函数,ms:format-date() 和 ms:format-time() 来解决后一个问题,但在 .NET 或 MSXML3 中不支持它们。

没有ms:date-time()功能,但有一个MSXSL 扩展

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:ecma ="about:ecma">
    <msxsl:script implements-prefix="ecma">
     <![CDATA[
      function GetCurrentDateTime()
        {
        var currentTime = new Date();
        var month = currentTime.getMonth() + 1;
        var day = currentTime.getDate();
        var year = currentTime.getFullYear();
        return(month + "/" + day + "/" + year);
        }
     ]]>
    </msxsl:script>

<xsl:template match="/">
    <xsl:value-of select="ecma:GetCurrentDateTime()"/>
</xsl:template>

</xsl:stylesheet>

Firefox 使用Transformiix,它从 FF6开始就支持EXSLT 。date-time()

参考

于 2014-06-04T20:07:58.040 回答