我得到了/ author / book与xalan(v.2.7.2)jar文件的区别,但我在java rt.jar文件中获得了相同的计数。
看起来exslt:node-set不能多次使用xalan jar的模板计数中的相同参数。
我想知道为什么我用xalan jar得到了ct2 = 0,但是用java rt.jar获得了ct = 2?这是xalan.jar的限制还是我的代码不正确?
以下是我的测试xsl。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:variable name="mod_books">
<author>
<book>book 1</book>
<book>book 2</book>
</author>
</xsl:variable>
<!--below line gives error org.xml.sax.SAXParseException -->
<!--print:<xsl:value-of select=$mod_books/author"/><br/>-->
<xsl:call-template name="count">
<xsl:with-param name="author" select="exslt:node-set($mod_books)" />
</xsl:call-template>
</xsl:template>
<xsl:template name="count">
<xsl:param name="author" />
ct1=<xsl:value-of select="count(exslt:node-set($author)/author/book)"/>
and ct2=<xsl:value-of select="count(exslt:node-set($author)/author/book)"/>
<br/>
<!--below line gives error java.lang.ClassCastException if no node-set function in the call template (xsl:with-param name="author" select="$mod_books") -->
<!--print:<xsl:value-of select=$author/author"/><br/>-->
</xsl:template>
</xsl:stylesheet>
解决方法!
对于xalan jar,解决方法是在调用模板或模板中定义节点集。这两个选项给出相同的结果(ct1 = 2和ct2 = 2)。 谢谢michael.hor257k!
Opt.1
<xsl:call-template name="count">
<xsl:with-param name="author" select="$mod_books" />
</xsl:call-template>
</xsl:template>
<xsl:template name="count">
<xsl:param name="author" />
ct1=<xsl:value-of select="count(exslt:node-set($author)/author/book)"/>
and ct2=<xsl:value-of select="count(exslt:node-set($author)/author/book)"/>
</xsl:template>
Opt.2
<xsl:call-template name="count">
<xsl:with-param name="author" select="exslt:node-set($mod_books)" />
</xsl:call-template>
</xsl:template>
<xsl:template name="count">
<xsl:param name="author" />
ct1=<xsl:value-of select="count($author/author/book)"/>
and ct2=<xsl:value-of select="count($author/author/book)"/>
</xsl:template>