2012-12-19 33 views
3

我是新来的xslt并有一个问题。xsl变量初始化,方法不会被调用

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

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

当我启动我的应用程序时,我看到这个方法没有被调用。

我只在我的控制台测试消息看,当我加入我的XSL文件这样的代码:

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

那么,是我的错误或XSL:第一次使用时初始化的变量?


我有这样的代码:

<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> 

+0

是不是在懒计算中的原因?没有任何声明变量的使用,所以它没有意义来计算它们 – bsiamionau

回答

2

一些像Saxon这样的XSLT处理器使用懒惰评估,因此变量将不会被评估直到它实际需要。 所以,你没有使用这种方法,还有其他的可能性来调用方法。 如果变量在你的xsl文档中没用,请使用类似下面的代码:

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

第一点:在XSLT扩展功能是产品的高度依赖,所以你不能真正问我们这个问题,没有告诉我们什么您正在使用的XSLT处理器。

混合声明性语言和过程性语言总是会很棘手(最好的办法是避免它)。当然,在XSLT中,优化处理器会懒惰地评估变量,这意味着如果一个变量没有被引用,那么它将不会被评估。

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