public Expression compile(Executable exec, Declaration decl) throws XPathException
{
Template preserve =
(getFingerprint() == StandardNames.XSL_PRESERVE_SPACE ? Stripper.PRESERVE : Stripper.STRIP);
StripSpaceRules stripperRules = getPrincipalStylesheetModule().getStripperRules();
// elements is a space-separated list of element names
StringTokenizer st = new StringTokenizer(elements, " \t\n\r", false);
while (st.hasMoreTokens()) {
String s = st.nextToken();
NodeTest nt;
if (s.equals("*")) {
nt = NodeKindTest.ELEMENT;
stripperRules.addRule(nt, preserve, decl.getModule(), decl.getSourceElement().getLineNumber());
} else if (s.endsWith(":*")) {
if (s.length()==2) {
compileError("No prefix before ':*'");
}
String prefix = s.substring(0, s.length()-2);
String uri = getURIForPrefix(prefix, false);
nt = new NamespaceTest(getNamePool(), Type.ELEMENT, uri);
stripperRules.addRule(nt, preserve, decl.getModule(), decl.getSourceElement().getLineNumber());
} else if (s.startsWith("*:")) {
if (s.length()==2) {
compileError("No local name after '*:'");
}
String localname = s.substring(2);
nt = new LocalNameTest(getNamePool(), Type.ELEMENT, localname);
stripperRules.addRule(nt, preserve, decl.getModule(), decl.getSourceElement().getLineNumber());
} else {
String prefix;
String localName;
String uri;
try {
String[] parts = NameChecker.getQNameParts(s);
prefix = parts[0];
if (parts[0].equals("")) {
uri = getDefaultXPathNamespace();
} else {
uri = getURIForPrefix(prefix, false);
if (uri == null) {
undeclaredNamespaceError(prefix, "XTSE0280");
return null;
}
}
localName = parts[1];
} catch (QNameException err) {
compileError("Element name " + s + " is not a valid QName", "XTSE0280");
return null;
}
NamePool target = getNamePool();
int nameCode = target.allocate("", uri, localName);
nt = new NameTest(Type.ELEMENT, nameCode, getNamePool());
stripperRules.addRule(nt, preserve, decl.getModule(), decl.getSourceElement().getLineNumber());
}
}
return null;
}