xsl变量初始化,方法不被调用

时间:2012-12-19 08:15:52

标签: java xml xslt xsl-variable

我是xslt的新手并且有一个问题。

我有一个包含所有必要的setter和getter的validate类。例如,它有这样的方法:

public void setProducer(String producer) {
    this.producer = producer;
    System.out.println("TEST");
}

当我启动我的应用程序时,我发现此方法未被调用。

我只在控制台中看到我的测试消息,当我在我的xsl文件中添加这样的代码:

<xsl:value-of name="producerName" />

那么我的错误或xsl:variable在首次使用时初始化了什么?


我有这段代码:

<xsl:param name="category-name" />
<xsl:param name="subcategory-name" />
<xsl:param name="producer" />
<xsl:param name="model" />
<xsl:param name="color" />
<xsl:param name="date_of_issue" />
<xsl:param name="price" />
<xsl:param name="not_in_stock" />
<xsl:variable name="validator" select="validation:new()" />
<xsl:template match="/">
    <xsl:for-each select="products/category">
        <xsl:if test="name() = 'category' and @name=$category-name">
            <xsl:apply-templates select="subcategory[@name=$subcategory-name]" />
        </xsl:if>
    </xsl:for-each>
</xsl:template>

<xsl:template match="subcategory">
    <xsl:apply-templates select="good" />
    <xsl:variable name="errorSize"
        select="validation:getErrorListSize($validator)" />
    <xsl:if test="$errorSize = 0">
        <xsl:variable name="producerName"
            select="validation:setProducer($validator, $producer)" />

        <xsl:variable name="setModel"
            select="validation:setModel($validator, $model)" />
        <xsl:variable name="setColor"
            select="validation:setColor($validator, $color)" />
        <xsl:variable name="setDateOfIssue"
            select="validation:setDateOfIssue($validator, $date_of_issue)" />
        <xsl:if test="$not_in_stock != null">
            <xsl:variable name="setPrice"
                select="validation:setPrice($validator, $price)" />
        </xsl:if>
        <xsl:variable name="validationResult"
            select="validation:validateAllFields($validator)" />
        VALIDATION FINISHED
        <xsl:variable name="errors"
            select="validation:getErrorListSize($validator)" />
            <xsl:value-of select="$errors"/>

    </xsl:if>
    <xsl:if test="$errorSize != 0">
        REDIRECT. ERROR EXISTS
    </xsl:if>
</xsl:template>

2 个答案:

答案 0 :(得分:4)

第一点:XSLT中的扩展函数与产品高度相关,因此如果不告诉我们您正在使用的XSLT处理器,就无法真正问我们这个问题。

混合使用声明性语言和过程语言总是很棘手(最好的办法就是避免它)。当然,在XSLT中,优化处理器将懒惰地评估变量,这意味着如果未引用变量,则不会对其进行求值。

在Saxon中,如果你“假装”在结果树中使用方法的结果,你通常可以调用具有副作用的Java方法;你可以通过从xsl:value-of instruction调用方法来实现它。

答案 1 :(得分:2)

某些XSLT处理器(如Saxon)使用延迟评估,因此不会评估变量,直到实际需要它为止。 所以,你没有使用这种方法,还有其他可能的方法来调用方法。 如果变量在xsl文档中没用,请改用以下内容:

<xsl:value-of select="validation:setProducer($validator, $producer)"/>