我的目标:我需要使用XSL样式表将XML文档中的“出生日期”元素转换为“年龄”值并生成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?我是否必须使用像SAXON / Xalan这样的XSLT进程器?难道我做错了什么?还有另一种方法吗?
答案 0 :(得分: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)
Chrome,Opera和Safari使用 libxslt
,但由于禁用了EXSLT,date-time()
无效:
我认为添加功能零碎是没有意义的;在将近5年之后,还有什么东西阻止libexslt被包含在构建中,并且从XSLTExtensions.cpp中的registerXSLTExtensions()调用exsltRegisterAll()?
IE使用MSXML
,它具有以下支持:
MSXML4提供了两个很棒的扩展函数,ms:format-date()和ms:format-time()来解决后一个问题,但它们在.NET或MSXML3中不受支持。
没有ms:date-time()
功能,但有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使用Transformiix,自FF6以来,support为EXSLT date-time()
。
<强>参考强>