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

net.sf.saxon.style.LiteralResultElement Maven / Gradle / Ivy

package net.sf.saxon.style;
import net.sf.saxon.Configuration;
import net.sf.saxon.PreparedStylesheet;
import net.sf.saxon.expr.Expression;
import net.sf.saxon.expr.Literal;
import net.sf.saxon.instruct.*;
import net.sf.saxon.om.*;
import net.sf.saxon.trace.Location;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.tree.DocumentImpl;
import net.sf.saxon.tree.TreeBuilder;
import net.sf.saxon.type.SchemaType;

import javax.xml.transform.TransformerException;


/**
* This class represents a literal result element in the style sheet
* (typically an HTML element to be output). 
* It is also used to represent unknown top-level elements, which are ignored. */ public class LiteralResultElement extends StyleElement { private int resultNameCode; private int[] attributeNames; private Expression[] attributeValues; private int numberOfAttributes; private boolean toplevel; private int[] namespaceCodes; private AttributeSet[] attributeSets; private SchemaType schemaType = null; private int validation = Validation.STRIP; private boolean inheritNamespaces = true; /** * Determine whether this type of element is allowed to contain a sequence constructor * @return true: yes, it may contain a sequence constructor */ public boolean mayContainSequenceConstructor() { return true; } /** * Specify that this is an instruction */ public boolean isInstruction() { return true; } /** * Process the attribute list */ public void prepareAttributes() throws XPathException { // Process the values of all attributes. At this stage we deal with attribute // values (especially AVTs), but we do not apply namespace aliasing to the // attribute names. int num = attributeList.getLength(); if (num == 0) { numberOfAttributes = 0; } else { NamePool namePool = getNamePool(); attributeNames = new int[num]; attributeValues = new Expression[num]; numberOfAttributes = 0; for (int i=0; i 0) { for (int i=0; i 0) { for (int i=attributeNames.length - 1; i>=0; i--) { FixedAttribute att = new FixedAttribute( attributeNames[i], Validation.STRIP, null, StandardNames.XS_UNTYPED_ATOMIC); try { att.setSelect(attributeValues[i], exec.getConfiguration()); } catch (XPathException err) { compileError(err); } att.setLocationId(allocateLocationId(getSystemId(), getLineNumber())); Expression exp = att; if (getConfiguration().isCompileWithTracing()) { TraceExpression trace = new TraceExpression(exp); trace.setLineNumber(getLineNumber()); trace.setColumnNumber(-1); trace.setSystemId(getSystemId()); trace.setNamespaceResolver(getNamespaceResolver()); trace.setConstructType(Location.LITERAL_RESULT_ATTRIBUTE); trace.setLocationId(allocateLocationId(getSystemId(), getLineNumber())); trace.setObjectName(new StructuredQName(getNamePool(), attributeNames[i])); exp = trace; } if (content == null) { content = exp; } else { content = Block.makeBlock(exp, content); content.setLocationId(allocateLocationId(getSystemId(), getLineNumber())); } } } if (attributeSets != null) { UseAttributeSets use = new UseAttributeSets(attributeSets); if (content == null) { content = use; } else { content = Block.makeBlock(use, content); content.setLocationId(allocateLocationId(getSystemId(), getLineNumber())); } } if (content == null) { content = Literal.makeEmptySequence(); } inst.setContentExpression(content); return inst; } /** * Make a top-level literal result element into a stylesheet. This implements * the "Simplified Stylesheet" facility. * @param pss the PreparedStylesheet (the compiled stylesheet as provided) * @param nodeFactory the node factory used to construct the stylesheet tree * @return the reconstructed stylesheet with an xsl:stylesheet and xsl:template element added */ public DocumentImpl makeStylesheet(PreparedStylesheet pss, StyleNodeFactory nodeFactory) throws XPathException { // the implementation grafts the LRE node onto a containing xsl:template and // xsl:stylesheet NamePool pool = getNamePool(); String xslPrefix = getPrefixForURI(NamespaceConstant.XSLT); if (xslPrefix==null) { String message; if (getLocalPart().equals("stylesheet") || getLocalPart().equals("transform")) { if (getPrefixForURI(NamespaceConstant.MICROSOFT_XSL) != null) { message = "Saxon is not able to process Microsoft's WD-xsl dialect"; } else { message = "Namespace for stylesheet element should be " + NamespaceConstant.XSLT; } } else { message = "The supplied file does not appear to be a stylesheet"; } XPathException err = new XPathException(message); err.setLocator(this); err.setErrorCode("XTSE0165"); err.setIsStaticError(true); //noinspection EmptyCatchBlock try { pss.reportError(err); } catch (TransformerException err2) { } throw err; } // check there is an xsl:version attribute (it's mandatory), and copy // it to the new xsl:stylesheet element String version = getAttributeValue(StandardNames.XSL_VERSION); if (version==null) { XPathException err = new XPathException("Simplified stylesheet: xsl:version attribute is missing"); err.setErrorCode("XTSE0150"); err.setIsStaticError(true); err.setLocator(this); //noinspection EmptyCatchBlock try { pss.reportError(err); } catch (TransformerException err2) { } throw err; } try { TreeBuilder builder = new TreeBuilder(); builder.setPipelineConfiguration(pss.getConfiguration().makePipelineConfiguration()); builder.setNodeFactory(nodeFactory); builder.setSystemId(this.getSystemId()); builder.open(); builder.startDocument(0); int st = StandardNames.XSL_STYLESHEET; builder.startElement(st, StandardNames.XS_UNTYPED, 0, 0); builder.namespace(NamespaceConstant.XSLT_CODE, 0); builder.attribute(pool.allocate("", "", "version"), StandardNames.XS_UNTYPED_ATOMIC, version, 0, 0); builder.startContent(); int te = StandardNames.XSL_TEMPLATE; builder.startElement(te, StandardNames.XS_UNTYPED, 0, 0); builder.attribute(pool.allocate("", "", "match"), StandardNames.XS_UNTYPED_ATOMIC, "/", 0, 0); builder.startContent(); builder.graftElement(this); builder.endElement(); builder.endElement(); builder.endDocument(); builder.close(); return (DocumentImpl)builder.getCurrentRoot(); } catch (XPathException err) { //TransformerConfigurationException e = new TransformerConfigurationException(err); err.setLocator(this); throw err; } } /** * Get the type of construct. This will be a constant in * class {@link net.sf.saxon.trace.Location}. This method is part of the * {@link net.sf.saxon.trace.InstructionInfo} interface */ public int getConstructType() { return Location.LITERAL_RESULT_ELEMENT; } /** * Get a name identifying the object of the expression, for example a function name, template name, * variable name, key name, element name, etc. This is used only where the name is known statically. * If there is no name, the value will be -1. * @return the name of the literal result element */ public int getObjectNameCode() { return resultNameCode; } /** * Get the value of a particular property of the instruction. This is part of the * {@link net.sf.saxon.trace.InstructionInfo} interface for run-time tracing and debugging. The properties * available include all the attributes of the source instruction (named by the attribute name): * these are all provided as string values. * @param name The name of the required property * @return The value of the requested property, or null if the property is not available */ public Object getProperty(String name) { if (name.equals("name")) { return getDisplayName(); } return null; } } // // The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); // you may not use this file except in compliance with the License. You may obtain a copy of the // License at http://www.mozilla.org/MPL/ // // Software distributed under the License is distributed on an "AS IS" basis, // WITHOUT WARRANTY OF ANY KIND, either express or implied. // See the License for the specific language governing rights and limitations under the License. // // The Original Code is: all this file. // // The Initial Developer of the Original Code is Michael H. Kay. // // Portions created by (your name) are Copyright (C) (your legal entity). All Rights Reserved. // // Contributor(s): none. //




© 2015 - 2024 Weber Informatics LLC | Privacy Policy