使用exslt:node-set with xalan.jar vs rt.jar

时间:2016-06-17 08:35:40

标签: xslt-1.0 xalan exslt

我得到了/ author / book与xalan(v.2.7.2)jar文件的区别,但我在java rt.jar文件中获得了相同的计数。

  • xalan jar:ct1 = 2且ct2 = 0
  • java rt.jar:ct1 = 2 and ct2 = 2

看起来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>

0 个答案:

没有答案