是否可以在XSLT 1.0中使用EXSLT日期和时间函数并使用浏览器引擎进行处理?



我的目标:我需要使用XSL样式表将XML文档中的"date of birth"元素转换为"age"值并生成XHTML页面。我正在使用web浏览器(例如IE/FF)直接打开XML文档。

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

以下是我的示例测试文件:

test.xml

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

这是否意味着EXSLT不被主要的web浏览器支持?我必须使用像SAXON/Xalan这样的XSLT处理器吗?我做错了什么吗?有别的办法吗?

使用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年之后,是否还有任何东西阻止libxslt被包含在构建中,以及在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()

引用

  • MDN: EXSLT
  • EXSLT - date:日期时间
  • Mozilla中的XSL转换(XSLT)
  • 浏览器支持XSLT的测试用例
  • Mozilla Bug 603159 -实现exslt-date:date-time()Webkit Bug 4079使用libxslt支持EXSLT Mozilla Bug 265254 -支持exist:date
  • Transformiix: Elements and Functions Available
  • 使用EXSLT构建实用解决方案。净
  • Microsoft XPath扩展函数

最新更新