/
SaxonSchemaReaderFactory.java
55 lines (49 loc) · 1.98 KB
/
SaxonSchemaReaderFactory.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package org.idpf.epubcheck.util.saxon;
import javax.xml.transform.TransformerFactory;
import com.thaiopensource.validate.schematron.SchematronSchemaReaderFactory;
import net.sf.saxon.Configuration;
import net.sf.saxon.TransformerFactoryImpl;
import net.sf.saxon.lib.ErrorReporter;
import net.sf.saxon.lib.FeatureKeys;
import net.sf.saxon.s9api.XmlProcessingError;
import net.sf.saxon.sxpath.IndependentContext;
import net.sf.saxon.sxpath.XPathStaticContext;
import net.sf.saxon.trans.SymbolicName;
public class SaxonSchemaReaderFactory extends SchematronSchemaReaderFactory
{
public void initTransformerFactory(TransformerFactory factory)
{
super.initTransformerFactory(factory);
factory.setAttribute(FeatureKeys.LINE_NUMBERING, Boolean.TRUE);
SymbolicName.F lineNumberFn = new SymbolicName.F(LineNumberFunction.QNAME, 0);
SymbolicName.F columnNumberFn = new SymbolicName.F(ColumnNumberFunction.QNAME, 0);
SymbolicName.F systemIdFn = new SymbolicName.F(SystemIdFunction.QNAME, 0);
if (factory instanceof TransformerFactoryImpl)
{
Configuration configuration = ((TransformerFactoryImpl) factory).getConfiguration();
configuration.setErrorReporterFactory(config -> {
return new ErrorReporter()
{
@Override
public void report(XmlProcessingError error)
{
System.out.println(error.getMessage());
}
};
});
XPathStaticContext xpathContext = new IndependentContext(configuration);
if (!xpathContext.getFunctionLibrary().isAvailable(lineNumberFn, 20))
{
configuration.registerExtensionFunction(new LineNumberFunction());
}
if (!xpathContext.getFunctionLibrary().isAvailable(columnNumberFn, 20))
{
configuration.registerExtensionFunction(new ColumnNumberFunction());
}
if (!xpathContext.getFunctionLibrary().isAvailable(systemIdFn, 20))
{
configuration.registerExtensionFunction(new SystemIdFunction());
}
}
}
}