📄 nodelistmodel.java
字号:
return((Element)node).getContent();
else if (node instanceof Document)
return((Document)node).getContent();
// With 2.1 semantics it makes more sense to just return a null and let the core
// throw an InvalidReferenceException and the template writer can use ?exists etcetera. (JR)
return null;
// throw new TemplateModelException("_content can not be applied on " + node.getClass());
}
}
private static final class TextOp implements NodeOperator {
public List operate(Object node)
{
if (node instanceof Element)
return Collections12.singletonList(((Element)node).getTextTrim());
if (node instanceof Attribute)
return Collections12.singletonList(((Attribute)node).getValue());
if (node instanceof CDATA)
return Collections12.singletonList(((CDATA)node).getText());
if (node instanceof Comment)
return Collections12.singletonList(((Comment)node).getText());
if (node instanceof ProcessingInstruction)
return Collections12.singletonList(((ProcessingInstruction)node).getData());
// With 2.1 semantics it makes more sense to just return a null and let the core
// throw an InvalidReferenceException and the template writer can use ?exists etcetera. (JR)
return null;
// throw new TemplateModelException("_text can not be applied on " + node.getClass());
}
}
private static final List evaluateElementOperation(NodeOperator op, List nodes)
throws
TemplateModelException
{
int s = nodes.size();
List[] lists = new List[s];
int l = 0;
{
int i = 0;
Iterator it = nodes.iterator();
while (it.hasNext()) {
List list = op.operate(it.next());
if (list != null) {
lists[i++] = list;
l += list.size();
}
}
}
List retval = new ArrayList(l);
for (int i = 0; i < s; ++i) {
if (lists[i] != null) {
retval.addAll(lists[i]);
}
}
return retval;
}
private static final List evaluateNamedElementOperation(NamedNodeOperator op, String localName, Namespace namespace, List nodes)
throws
TemplateModelException
{
int s = nodes.size();
List[] lists = new List[s];
int l = 0;
{
int i = 0;
Iterator it = nodes.iterator();
while (it.hasNext()) {
List list = op.operate(it.next(), localName, namespace);
lists[i++] = list;
l += list.size();
}
}
List retval = new ArrayList(l);
for (int i = 0; i < s; ++i)
retval.addAll(lists[i]);
return retval;
}
private static final List removeDuplicates(List list)
{
int s = list.size();
ArrayList ulist = new ArrayList(s);
Set set = new HashSet(s * 4 / 3, .75f);
Iterator it = list.iterator();
while (it.hasNext()) {
Object o = it.next();
if (set.add(o))
ulist.add(o);
}
ulist.trimToSize();
return ulist;
}
private static final Map createOperations()
{
Map map = new HashMap();
map.put("_ancestor", new AncestorOp());
map.put("_ancestorOrSelf", new AncestorOrSelfOp());
map.put("_attributes", ALL_ATTRIBUTES_OP);
map.put("_children", ALL_CHILDREN_OP);
map.put("_cname", new CanonicalNameOp());
map.put("_content", new ContentOp());
map.put("_descendant", new DescendantOp());
map.put("_descendantOrSelf", new DescendantOrSelfOp());
map.put("_document", new DocumentOp());
map.put("_doctype", new DocTypeOp());
map.put("_name", new NameOp());
map.put("_nsprefix", new NamespacePrefixOp());
map.put("_nsuri", new NamespaceUriOp());
map.put("_parent", new ParentOp());
map.put("_qname", new QNameOp());
map.put("_text", new TextOp());
return map;
}
private static final Map createSpecialOperations()
{
Map map = new HashMap();
Integer copy = new Integer(SPECIAL_OPERATION_COPY);
Integer unique = new Integer(SPECIAL_OPERATION_UNIQUE);
Integer fname = new Integer(SPECIAL_OPERATION_FILTER_NAME);
Integer ftype = new Integer(SPECIAL_OPERATION_FILTER_TYPE);
Integer type = new Integer(SPECIAL_OPERATION_QUERY_TYPE);
Integer regns = new Integer(SPECIAL_OPERATION_REGISTER_NAMESPACE);
Integer plaintext = new Integer(SPECIAL_OPERATION_PLAINTEXT);
map.put("_copy", copy);
map.put("_unique", unique);
map.put("_fname", fname);
map.put("_ftype", ftype);
map.put("_type", type);
map.put("_registerNamespace", regns);
map.put("_plaintext", plaintext);
// These are in for backward compatibility
map.put("x_copy", copy);
map.put("x_unique", unique);
map.put("x_fname", fname);
map.put("x_ftype", ftype);
map.put("x_type", type);
return map;
}
private final class RegisterNamespace implements TemplateMethodModel {
public boolean isEmpty()
{
return false;
}
public Object exec(List arguments)
throws
TemplateModelException
{
if (arguments.size() != 2)
throw new TemplateModelException("_registerNamespace(prefix, uri) requires two arguments");
registerNamespace((String)arguments.get(0), (String)arguments.get(1));
return TemplateScalarModel.EMPTY_STRING;
}
}
private final class NameFilter implements TemplateMethodModel {
public boolean isEmpty()
{
return false;
}
public Object exec(List arguments)
{
Set names = new HashSet(arguments);
List list = new LinkedList(nodes);
Iterator it = list.iterator();
while (it.hasNext()) {
Object node = it.next();
String name = null;
if (node instanceof Element)
name = ((Element)node).getName();
else if (node instanceof Attribute)
name = ((Attribute)node).getName();
else if (node instanceof ProcessingInstruction)
name = ((ProcessingInstruction)node).getTarget();
else if (node instanceof EntityRef)
name = ((EntityRef)node).getName();
else if (node instanceof DocType)
name = ((DocType)node).getPublicID();
if (name == null || !names.contains(name))
it.remove();
}
return createNodeListModel(list, namespaces);
}
}
private final class TypeFilter implements TemplateMethodModel {
public boolean isEmpty()
{
return false;
}
public Object exec(List arguments)
throws
TemplateModelException
{
if (arguments == null || arguments.size() == 0)
throw new TemplateModelException("_type expects exactly one argument");
String arg = (String)arguments.get(0);
boolean invert = arg.indexOf('!') != -1;
// NOTE: true in each of these variables means 'remove', not 'keep'
// This is so we don't invert their values in the loop. So,
// a is true <--> (a is not present in the string) xor invert.
boolean a = invert != (arg.indexOf('a') == -1);
boolean c = invert != (arg.indexOf('c') == -1);
boolean d = invert != (arg.indexOf('d') == -1);
boolean e = invert != (arg.indexOf('e') == -1);
boolean n = invert != (arg.indexOf('n') == -1);
boolean p = invert != (arg.indexOf('p') == -1);
boolean t = invert != (arg.indexOf('t') == -1);
boolean x = invert != (arg.indexOf('x') == -1);
LinkedList list = new LinkedList(nodes);
Iterator it = list.iterator();
while (it.hasNext()) {
Object node = it.next();
if ((node instanceof Element && e)
|| (node instanceof Attribute && a)
|| (node instanceof String && x)
|| (node instanceof Text && x)
|| (node instanceof ProcessingInstruction && p)
|| (node instanceof Comment && c)
|| (node instanceof EntityRef && n)
|| (node instanceof Document && d)
|| (node instanceof DocType && t))
it.remove();
}
return createNodeListModel(list, namespaces);
}
}
/**
* Loads a template from a file passed as the first argument, loads an XML
* document from the standard input, passes it to the template as variable
* <tt>document</tt> and writes the result of template processing to
* standard output.
*/
public static void main(String[] args)
throws
Exception
{
org.jdom.input.SAXBuilder builder = new org.jdom.input.SAXBuilder();
Document document = builder.build(System.in);
SimpleHash model = new SimpleHash();
model.put("document", new NodeListModel(document));
FileReader fr = new FileReader(args[0]);
Template template = new Template(args[0], fr);
Writer w = new java.io.OutputStreamWriter(System.out);
template.process(model, w);
w.flush();
w.close();
}
private static final class AttributeXMLOutputter extends XMLOutputter {
public void output(Attribute attribute, Writer out)
throws
IOException
{
out.write(" ");
out.write(attribute.getQualifiedName());
out.write("=");
out.write("\"");
out.write(escapeAttributeEntities(attribute.getValue()));
out.write("\"");
}
}
private static final class JDOMXPathEx
extends
JDOMXPath
{
JDOMXPathEx(String path)
throws
JaxenException
{
super(path);
}
public List selectNodes(Object object, Map namespaces)
throws
JaxenException
{
Context context = getContext(object);
context.getContextSupport().setNamespaceContext(new NamespaceContextImpl(namespaces));
return selectNodesForContext(context);
}
private static final class NamespaceContextImpl
implements
NamespaceContext
{
private final Map namespaces;
NamespaceContextImpl(Map namespaces)
{
this.namespaces = namespaces;
}
public String translateNamespacePrefixToUri(String prefix)
{
// Empty prefix always maps to empty URL in XPath
if(prefix.length() == 0)
{
return prefix;
}
synchronized(namespaces)
{
Namespace ns = (Namespace)namespaces.get(prefix);
return ns == null ? null : ns.getURI();
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -