问题描述
|
我的目标:我需要使用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.
这是否意味着主流网络浏览器不支持EXSLT?我必须使用像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)
Chrome,Opera和Safari使用libxslt
,但由于禁用了EXSLT,date-time()
不起作用:
我认为零散添加功能是没有道理的;在将近5年后,还有什么阻止libexslt包含在build中,以及阻止从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起便支持EXSLTdate-time()
。
参考文献
MDN:EXSLT
EXSLT-日期:date-time
Mozilla中的XSL转换(XSLT)
浏览器中对XSLT支持的测试用例
Mozilla错误603159-实现exslt-date:date-time()
Webkit错误4079通过libexslt支持EXSLT
Mozilla错误265254-支持exlst:date
Transformiix:可用的元素和功能
使用EXSLT.NET构建实用的解决方案
Microsoft XPath扩展功能