我正在使用Saxon XSLT处理器的开源版本“来自Saxonica的Saxon 9.0.0.2J”,并且我第一次尝试使用java可扩展性。我在跑步 我怀疑这个问题可能是对开源版本的限制,但是想先检查一下我是否会遗漏这些东西。
从下面的代码片段中,我的结果是$ c1的最终值不会因为调用greg而变化:setTime() - 即Saxon中的$ c1变量似乎从底层Java对象中取消了并且没有明显的方法来访问由setTime()调用更新的对象。
请注意,代码段中的所有代码都经过测试并正常工作 - 即$ c1由getInstance()调用正确实例化,$ startdate格式正确,$ d1已正确实例化。
思想?
<xsl:transform
.....
xmlns:sql="java:java.sql.Date"
xmlns:greg="java:java.util.GregorianCalendar"
.....
>
....
<xsl:element name="JobExpireDate">
<xsl:variable name="c1" select="greg:getInstance()" />
<xsl:variable name="d1" select="sql:valueOf($startdate)" />
<xsl:variable name="void" select="greg:setTime($c1,$d1)" />
<xsl:value-of select="$c1" />
</xsl:element>
答案 0 :(得分:1)
我刚试过saxonb9-0-0-8j。
有时会忽略对void函数的调用,如下所示。
输入文件:
<root>
<date1>2009-01-02</date1>
<date2>2009-01-02</date2>
</root>
变换:
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sql="java:java.sql.Date"
xmlns:greg="java:java.util.GregorianCalendar"
version="2.0">
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="root/date1/text()">
<xsl:variable name="c1" select="greg:getInstance()" />
<xsl:variable name="d1" select="sql:valueOf(.)" />
<xsl:variable name="void" select="greg:setTime($c1,$d1)" />
<xsl:value-of select="greg:getTime($c1)" />
</xsl:template>
<xsl:template match="root/date2/text()">
<xsl:variable name="c1" select="greg:getInstance()" />
<xsl:variable name="d1" select="sql:valueOf(.)" />
<xsl:value-of select="greg:setTime($c1,$d1)" />
<xsl:value-of select="greg:getTime($c1)" />
</xsl:template>
</xsl:transform>
结果:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<date1>2010-04-14T08:23:25.341Z</date1>
<date2>2009-01-01T23:00:00Z</date2>
</root>
因此似乎没有为date1调用setTime()
,而是为date2调用。
Saxon有一个很好的explain
功能,它以可读的格式显示解析的转换:
...
<templateRule match="root/date2/text()" precedence="0" priority="0.5" line="21"
module="file:/C:/devtools/saxonb9-0-0-8j/template.xsl">
<let variable="c1" as="java:java.util.Calendar?">
<be>
<functionCall name="greg:getInstance"/>
</be>
<return>
<sequence>
<valueOf>
<simpleContentConstructor>
<functionCall name="greg:setTime">
<variableReference name="c1"/>
<functionCall name="sql:valueOf">
<dot/>
</functionCall>
</functionCall>
<literal value=" " type="xs:string"/>
</simpleContentConstructor>
</valueOf>
<valueOf>
<simpleContentConstructor>
<functionCall name="greg:getTime">
<variableReference name="c1"/>
</functionCall>
<literal value=" " type="xs:string"/>
</simpleContentConstructor>
</valueOf>
</sequence>
</return>
</let>
</templateRule>
<templateRule match="root/date1/text()" precedence="0" priority="0.5" line="14"
module="file:/C:/devtools/saxonb9-0-0-8j/template.xsl">
<valueOf>
<simpleContentConstructor>
<functionCall name="greg:getTime">
<functionCall name="greg:getInstance"/>
</functionCall>
<literal value=" " type="xs:string"/>
</simpleContentConstructor>
</valueOf>
</templateRule>
...
如您所见,对于date1,将忽略对setTime()
的调用,但是对于date2。
答案 1 :(得分:0)
您是否使用java.sql.Date作为参数在GregorianCalendar上调用setTime?不应该失败吗?或者是否发生了一些隐藏的转换?
如果失败了,撒克逊可能会默默地忽略这个错误吗?
我注意到在某些版本的Xalan中,XSLT编译器会忽略对void函数的调用。撒克逊人可能表现得很相似。