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

发布于 2024-11-01 18:12:06 字数 1074 浏览 6 评论 0原文

我的目标:我需要使用 XSL 样式表将 XML 文档中的“出生日期”元素转换为“年龄”值并生成 XHTML 页面。我正在使用网络浏览器(例如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.

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

My goal: I need to transform a "date of birth" element in XML document to "age" value using XSL stylesheet and generate XHTML page. I am using the web browser (e.g. IE/FF) directly to open the XML document.

I know XSLT 2.0 has built-in date and time functions, but I think no browser currently support this. So, I've been trying to use EXSLT functions instead without success.

Here are my sample test files:

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>

Error on IE8:

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

Error on FF4:

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

Does that mean EXSLT is not supported by major web browsers? Do I have to use XSLT proccessor like SAXON/Xalan? Am I doing something wrong? Is there an alternative way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

多孤肩上扛 2024-11-08 18:12:06

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

以下 XSLT 处理器支持日期:日期-时间:

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)

Chrome、Opera 和 Safari 使用 libxslt,但 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()

参考资料

Use the EXSLT support matrix as a reference:

The following XSLT processors support 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 is used by Chrome, Opera and Safari, but date-time() does not work since EXSLT is disabled:

I don't think it makes sense to add functions piecemeal; after nearly 5 years is there still anything preventing libexslt being included in the build and exsltRegisterAll() being called from registerXSLTExtensions() in XSLTExtensions.cpp?

IE uses MSXML, which has the following support:

MSXML4 provided two great extension functions, ms:format-date() and ms:format-time() to aim at the latter problem, but they are not supported in .NET or MSXML3.

There is no ms:date-time() function, but there is an MSXSL extension.

<?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 uses Transformiix, which has support for EXSLT date-time() since FF6.

References

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文