All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.saxon.jaxp.TemplatesImpl Maven / Gradle / Ivy

There is a newer version: 12.5
Show newest version
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2018-2023 Saxonica Limited
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package net.sf.saxon.jaxp;

import net.sf.saxon.s9api.XsltExecutable;

import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import java.util.Properties;

/**
 * Saxon implementation of the JAXP Templates interface.
 * 

Since Saxon 9.6, JAXP interfaces are implemented as a layer above the s9api interface

*/ public class TemplatesImpl implements Templates { private final TransformerFactory factory; private final XsltExecutable executable; private boolean forceStreaming; public TemplatesImpl(TransformerFactory factory, XsltExecutable executable) { this.factory = factory; this.executable = executable; } /** * Create a new transformation context for this Templates object. * * @return A valid non-null instance of a Transformer. */ @Override public Transformer newTransformer() { Transformer result; if (forceStreaming) { result = new StreamingTransformerImpl(executable, executable.load30()); } else { result = new TransformerImpl(executable, executable.load()); } if (factory.getURIResolver() != null) { result.setURIResolver(factory.getURIResolver()); } return result; } /** * Get the properties corresponding to the effective xsl:output element. * The object returned will * be a clone of the internal values. Accordingly, it can be mutated * without mutating the Templates object, and then handed in to * {@link javax.xml.transform.Transformer#setOutputProperties}. *

The properties returned should contain properties set by the stylesheet, * and these properties are "defaulted" by default properties specified by * section 16 of the * XSL Transformations (XSLT) W3C Recommendation. The properties that * were specifically set by the stylesheet should be in the base * Properties list, while the XSLT default properties that were not * specifically set should be in the "default" Properties list. Thus, * getOutputProperties().getProperty(String key) will obtain any * property in that was set by the stylesheet, or the default * properties, while * getOutputProperties().get(String key) will only retrieve properties * that were explicitly set in the stylesheet.

*

For XSLT, * Attribute * Value Templates attribute values will * be returned unexpanded (since there is no context at this point). The * namespace prefixes inside Attribute Value Templates will be unexpanded, * so that they remain valid XPath values.

* * @return A Properties object, never null. */ @Override public Properties getOutputProperties() { Properties details = executable.getUnderlyingCompiledStylesheet().getPrimarySerializationProperties().getProperties(); return new Properties(details); } /** * Ask whether any transformer created from this Templates object should have streaming behaviour. * Specifically this means that when a SAXSource or StreamSource is supplied as input to the transform() * method, provided that the initial mode is actually streamable, then the source object is not * materialized as the global context item, so any reference to the global context item from within * a global variable will fail with dynamic error XPDY0002. * * @return true if streaming behaviour is enforced for any generated Transformer object. */ public boolean isForceStreaming() { return forceStreaming; } /** * Say that any transformer created from this Templates object should have streaming behaviour. * Specifically this means that when a SAXSource or StreamSource is supplied as input to the transform() * method, provided that the initial mode is actually streamable, then the source object is not * materialized as the global context item, so any reference to the global context item from within * a global variable will fail with dynamic error XPDY0002. * * @param forceStreaming true if streaming behaviour is to be enforced for any generated * Transformer object. */ public void setForceStreaming(boolean forceStreaming) { this.forceStreaming = forceStreaming; } /** * Get the underlying implementation object * @return the underlying S9API {@link XsltExecutable} object */ public XsltExecutable getImplementation() { return executable; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy