package client.net.sf.saxon.ce.style;
import client.net.sf.saxon.ce.expr.Expression;
import client.net.sf.saxon.ce.expr.instruct.Executable;
import client.net.sf.saxon.ce.om.*;
import client.net.sf.saxon.ce.trans.XPathException;
import client.net.sf.saxon.ce.tree.iter.AxisIterator;
import client.net.sf.saxon.ce.value.Whitespace;
/**
* An xsl:character-map declaration in the stylesheet. <br>
*/
public class XSLCharacterMap extends StyleElement {
String use;
// the value of the use-character-maps attribute, as supplied
boolean validated = false;
// set to true once validate() has been called
/**
* Ask whether this node is a declaration, that is, a permitted child of xsl:stylesheet
* (including xsl:include and xsl:import).
* @return true for this element
*/
@Override
public boolean isDeclaration() {
return true;
}
/**
* Get the fingerprint of the name of this character map
* @return the fingerprint value
*/
public StructuredQName getCharacterMapName() {
StructuredQName name = getObjectName();
if (name == null) {
try {
return makeQName(getAttributeValue("", "name"));
} catch (Exception err) {
// the error will be reported later
return new StructuredQName("", "", "unnamedCharacterMap_" + hashCode());
}
}
return name;
}
/**
* Validate the attributes on this instruction
* @throws XPathException
*/
public void prepareAttributes() throws XPathException {
String name = null;
use = null;
AttributeCollection atts = getAttributeList();
for (int a=0; a<atts.getLength(); a++) {
int nc = atts.getNameCode(a);
String f = getNamePool().getClarkName(nc);
if (f.equals(StandardNames.NAME)) {
name = Whitespace.trim(atts.getValue(a));
} else if (f.equals(StandardNames.USE_CHARACTER_MAPS)) {
use = atts.getValue(a);
} else {
checkUnknownAttribute(nc);
}
}
if (name==null) {
reportAbsence("name");
name = "unnamedCharacterMap_" + hashCode();
}
try {
setObjectName(makeQName(name));
} catch (NamespaceException err) {
compileError(err.getMessage(), "XTSE0280");
name = "unnamedCharacterMap_" + hashCode();
setObjectName(new StructuredQName("", "", name));
} catch (XPathException err) {
compileError(err.getMessage(), "XTSE0020");
name = "unnamedCharacterMap_" + hashCode();
setObjectName(new StructuredQName("", "", name));
}
}
public void validate(Declaration decl) throws XPathException {
if (validated) return;
// check that this is a top-level declaration
checkTopLevel(null);
// check that the only children are xsl:output-character elements
AxisIterator kids = iterateAxis(Axis.CHILD);
while (true) {
Item child = kids.next();
if (child == null) {
break;
}
if (!(child instanceof XSLOutputCharacter)) {
compileError("Only xsl:output-character is allowed within xsl:character-map", "XTSE0010");
}
}
validated = true;
}
public Expression compile(Executable exec, Declaration decl) throws XPathException {
return null;
}
}
// 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.