Инициализация переменной xsl, метод не вызывается

Я новичок в xslt и у меня есть вопрос.

У меня есть класс проверки, который содержит все необходимые установщики и получатели. Например у него есть такой метод:

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

Когда я запускаю свое приложение, я вижу, что этот метод не был вызван.

Я вижу в консоли только мое тестовое сообщение, когда добавляю в свой файл xsl такой код:

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

Так где же моя ошибка или переменная xsl: initialized при первом использовании?


У меня есть этот код:

<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 ответа

Решение

Некоторые процессоры XSLT, такие как Saxon, используют ленивую оценку, поэтому переменная не будет оцениваться до тех пор, пока она действительно не понадобится. Итак, у вас нет такого подхода, есть другие возможности для вызова методов. Если переменная бесполезна в вашем документе xsl, используйте что-то вроде этого:

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

Первый пункт: функции расширения в XSLT сильно зависят от продукта, поэтому вы не можете задать нам этот вопрос, не сказав нам, какой процессор XSLT вы используете.

Смешивание декларативного и процедурного языков всегда будет непростым делом (и лучше всего избегать этого). Конечно, в XSLT оптимизирующий процессор будет лениво оценивать переменные, что означает, что если на переменную нет ссылки, то она не будет оценена.

В Saxon вы обычно можете избежать вызова методов Java, которые имеют побочные эффекты, если вы "притворяетесь" использовать результат метода в вашем дереве результатов; этого можно добиться, вызвав метод из инструкции xsl:value-of.

Другие вопросы по тегам