TestMain.java - некоторые Java-файл с доступом к трансформации завода
import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import net.sf.saxon.TransformerFactoryImpl;
import net.sf.saxon.s9api.ExtensionFunction;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.jaxp.SaxonTransformerFactory;
import location.to.test.java.file.Test;
public class TestMain {
public static void main(String[] args) throws IOException, URISyntaxException, TransformerException {
TransformerFactory factory = TransformerFactory.newInstance();
// Grab the handle of Transformer factory and cast it to TransformerFactoryImpl
TransformerFactoryImpl tFactoryImpl = (TransformerFactoryImpl) factory;
// Get the currently used processor
net.sf.saxon.Configuration saxonConfig = tFactoryImpl.getConfiguration();
Processor processor = (Processor) saxonConfig.getProcessor();
// Here extension happens, test comes from class Test -> Test.java
ExtensionFunction test = new Test();
processor.registerExtensionFunction(test);
Source xslt = new StreamSource(new File("test.xsl"));
Transformer transformer = factory.newTransformer(xslt);
Source text = new StreamSource(new File("input.xml"));
transformer.transform(text, new StreamResult(new File("result.xml")));
}
}
Test.java - фактическая функция расширения логики
import net.sf.saxon.s9api.ExtensionFunction;
import net.sf.saxon.s9api.ItemType;
import net.sf.saxon.s9api.OccurrenceIndicator;
import net.sf.saxon.s9api.QName;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.SequenceType;
import net.sf.saxon.s9api.XdmAtomicValue;
import net.sf.saxon.s9api.XdmValue;
public class Test implements ExtensionFunction {
@Override
public QName getName() {
return new QName("http://some.namespace.com", "test");
}
@Override
public SequenceType getResultType() {
return SequenceType.makeSequenceType(ItemType.STRING, OccurrenceIndicator.ONE);
}
@Override
public net.sf.saxon.s9api.SequenceType[] getArgumentTypes() {
return new SequenceType[] {};
}
@Override
public XdmValue call(XdmValue[] arguments) throws SaxonApiException {
String result = "Saxon is being extended correctly.";
return new XdmAtomicValue(result);
}
}
test.xsl - test xsl. файл
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://some.namespace.com">
<xsl:output indent="yes"/>
<xsl:template match="/">
<root>
<xsl:value-of select="ext:test()" />
</root>
</xsl:template>
</xsl:stylesheet>
result.xml - результат всего процесса
Пожалуйста, обратите внимание, что пространство имен используется в .java и .xsl файл должен быть то же, объявленное в QName
Не работает ли образец в http://www.saxonica.com/html/documentation/extensibility/integratedfunctions/ext-simple-J.html? Я вставил этот код в шаблон приложения Java, созданный с помощью NetBeans, где я добавил файл 'saxon9he.jar' в качестве библиотеки, чтобы IDE зафиксировал раздел импорта для используемых классов и интерфейсов (мне пришлось исправить один импорт для' QName' так как выбранный импорт был для другого класса), пусть среда ID добавляет 'throws SaxonApiException' в метод' main' и компилируется и запускается код и добавляет 'System.out.println (result);' выводит результат. –
Или вы хотите реализовать свои функции расширения и использовать их при запуске 'net.sf.saxon.Transform' из командной строки? –
** 1) ** Спасибо за быстрый ответ Мартин. Между тем мне пришлось выяснить такую основную вещь, как загрузка не скомпилированной версии 'SaxonHE', и, как вы упомянули, я попытался создать проект с этим исходным кодом в' Eclipse'. Он есть, но, честно говоря, я не знаю, с чего начать. Поэтому мой вопрос связан скорее с настройкой среды 'Java' с исходным кодом SaxonHE. ** 2) ** Я хочу использовать расширенную функцию в шаблоне 'xsl', например' ' –