2015-10-28 2 views
1

Хотя запись встроенных функций расширения Saxon для меня довольно понятна.Встроенные функции расширения Saxon-HE | как и где?

У меня есть красный:

У меня очень трудно найти информацию, как на самом деле заставить их работать.

В: Где разместить файлы, нужно ли мне что-то выполнять, мне нужно изменить конфигурацию саксона? В основном, что мне нужно сделать, чтобы получить эту работу, помимо регистрации функции расширения с помощью процессора s9api.

+0

Не работает ли образец в 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);' выводит результат. –

+0

Или вы хотите реализовать свои функции расширения и использовать их при запуске 'net.sf.saxon.Transform' из командной строки? –

+0

** 1) ** Спасибо за быстрый ответ Мартин. Между тем мне пришлось выяснить такую ​​основную вещь, как загрузка не скомпилированной версии 'SaxonHE', и, как вы упомянули, я попытался создать проект с этим исходным кодом в' Eclipse'. Он есть, но, честно говоря, я не знаю, с чего начать. Поэтому мой вопрос связан скорее с настройкой среды 'Java' с исходным кодом SaxonHE. ** 2) ** Я хочу использовать расширенную функцию в шаблоне 'xsl', например' ' –

ответ

1

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

+0

Этот код дал мне следующее исключение: net.sf.saxon.TransformerFactoryImpl не может быть передан net.sf.saxon.s9api.Processor в процессоре процессора = (процессор) saxonConfig.getProcessor(); –

+0

Можете ли вы убедиться, что ваш импорт безупречен? –

+0

Что делать, если я использую saxon из командной строки? Думаю, я добавлю класс, содержащий функцию расширения, в путь к классам. Но как достичь эквивалента этого: ExtensionFunction test = new Test(); processor.registerExtensionFunction (тест); –