Xalan + XSLT + JAVA - PullRequest
       25

Xalan + XSLT + JAVA

2 голосов
/ 13 сентября 2011

Мой xsl файл

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:good="xalan://com.epam.laba.model.Good"
xmlns:validator="xalan://com.epam.laba.validator.ValidatorXslGood">

    <xsl:include href="parameter.xsl"/>
    <xsl:param name="validator"/>
    <xsl:param name="good"/>

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/|node()|@*">
        <xsl:if test="validator:validateGood($good)">
            <xsl:copy>
                <xsl:apply-templates
                select="node()|@*" />
            </xsl:copy>
        </xsl:if>
    </xsl:template>

......

Java-код, где создается валидатор и устанавливается значение xsl

    Good good=fillGood(parameters); 
    ValidatorXslGood validatorXslGood=new ValidatorXslGood();
    Source sourceXSL = new StreamSource(xsltFile);
    Transformer transformer = factory.newTransformer(sourceXSL);
    transformer.setParameter(SUBCATEGORY_ID_VALUE, subcategoryId);
    transformer.setParameter(GOOD, good);
    transformer.setParameter(VALIDATOR, validatorXslGood);

    transformer.transform(xmlSource, new StreamResult(outWriter));

но

Первый аргумент нестатической функции Java 'validateGood' не является допустимой ссылкой на объект. Невозможно преобразовать тип данных 'void' в 'логический'.

Можете ли вы объяснить мне, что не так?

UPD:

ValidatorXslGood.java код:

public class ValidatorXslGood {

private Good good;

private Map<String, String> setErrors;
private ResourceBundleManager errorManager;

public ValidatorXslGood() {
    errorManager = new ResourceBundleManager();
    errorManager.setResourceBundle(RESOURCE_BUNDLE__FOR_ERROR_FILE);
}

public Good getGood() {
    return good;
}

public void setGood(Good good) {
    this.good = good;
}

public boolean validateGood(Good good) {
    if (checkingName(good.getName())) {
        return true;
    } else {
        return false;
    }
}

Я пытаюсь создать валидатор в XSL

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:good="xalan://com.epam.laba.model.Good"
xmlns:validator="xalan://com.epam.laba.validator.ValidatorXslGood"
    extension-element-prefixes="validator" >

    <xsl:include href="parameter.xsl"/>
    <xsl:variable name="validatorConstructor" select="validator:new()"/>
    <xsl:param name="validator"/>
    <xsl:param name="good"/>

........

но у меня новая ошибка, и я не могу понять, где ошибка в пути

Не удается найти класс 'com.epam.laba.validator.ValidatorXslGood'. Не могу найти внешний конструктор 'com.epam.laba.validator.ValidatorXslGood'.

1 Ответ

4 голосов
/ 13 сентября 2011

Похоже, вы пропустили синтаксис. Здесь указано, что синтаксис должен иметь префикс : methodName (object, args) , где prefix - это префикс пространства имен расширения (который необходимо объявить как xmlns: prefix = "URI" extension-element-prefixes = "prefix ..." ) и methodName - это имя метода экземпляра, который нужно вызвать на object с аргументами аргументами.

<xsl:stylesheet
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:validator="xalan://com.epam.laba.parser.validator.ValidatorXslGood"
     extension-element-prefixes="validator" ... >

<xsl:param name="validator"/> <!-- That is in reality validatorObject -->
<xsl:param name="good"/>

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/|node()|@*">
    <xsl:if test="validator:validateGood($validator, $good)">
...
...