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

net.sf.saxon.pattern.SameNameTest Maven / Gradle / Ivy

There is a newer version: 12.5
Show newest version
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2015 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.pattern;

import net.sf.saxon.om.*;
import net.sf.saxon.tree.tiny.TinyTree;
import net.sf.saxon.tree.util.Navigator;
import net.sf.saxon.type.SchemaType;
import net.sf.saxon.type.Type;
import net.sf.saxon.type.UType;
import net.sf.saxon.z.IntSet;
import net.sf.saxon.z.IntSingletonSet;

/**
 * NodeTest is an interface that enables a test of whether a node has a particular
 * name and type. A SameNameTest matches a node that has the same node kind and name
 * as a supplied node.
 *
 * 

Note: it's not safe to use this if the supplied node is mutable.

* * @author Michael H. Kay */ public class SameNameTest extends NodeTest implements QNameTest { private NodeInfo origin; /** * Create a SameNameTest to match nodes by name * * @param origin the node whose node kind and name must be matched * @since 9.0 */ public SameNameTest(NodeInfo origin) { this.origin = origin; } /** * Get the node kind that this name test matches * * @return the matching node kind */ public int getNodeKind() { return origin.getNodeKind(); } /** * Get the corresponding {@link net.sf.saxon.type.UType}. A UType is a union of primitive item * types. * * @return the smallest UType that subsumes this item type */ public UType getUType() { return UType.fromTypeCode(origin.getNodeKind()); } /** * Test whether this node test is satisfied by a given node. This method is only * fully supported for a subset of NodeTests, because it doesn't provide all the information * needed to evaluate all node tests. In particular (a) it can't be used to evaluate a node * test of the form element(N,T) or schema-element(E) where it is necessary to know whether the * node is nilled, and (b) it can't be used to evaluate a node test of the form * document-node(element(X)). This in practice means that it is used (a) to evaluate the * simple node tests found in the XPath 1.0 subset used in XML Schema, and (b) to evaluate * node tests where the node kind is known to be an attribute. * * @param nodeKind The kind of node to be matched * @param name identifies the expanded name of the node to be matched. * The value should be null for a node with no name. * @param annotation The actual content type of the node */ @Override public boolean matches(int nodeKind, NodeName name, SchemaType annotation) { if (nodeKind != origin.getNodeKind()) { return false; } if (name.hasFingerprint() && origin instanceof FingerprintedNode) { return name.getFingerprint() == ((FingerprintedNode)origin).getFingerprint(); } else { return name.hasURI(origin.getURI()) && name.getLocalPart().equals(origin.getLocalPart()); } } /** * Test whether this node test is satisfied by a given node on a TinyTree. The node * must be a document, element, text, comment, or processing instruction node. * This method is provided so that when navigating a TinyTree a node can be rejected without * actually instantiating a NodeInfo object. * * @param tree the TinyTree containing the node * @param nodeNr the number of the node within the TinyTree * @return true if the node matches the NodeTest, otherwise false */ public boolean matches(TinyTree tree, int nodeNr) { if (tree.getNodeKind(nodeNr) != origin.getNodeKind()) { return false; } else if (origin instanceof FingerprintedNode) { return (tree.getNameCode(nodeNr) & NamePool.FP_MASK) == ((FingerprintedNode) origin).getFingerprint(); } else { return Navigator.haveSameName(tree.getNode(nodeNr), origin); } } /** * Test whether this node test is satisfied by a given node. This alternative * method is used in the case of nodes where calculating the fingerprint is expensive, * for example DOM or JDOM nodes. * * @param node the node to be matched */ public boolean matchesNode(NodeInfo node) { return node == origin || (node.getNodeKind() == origin.getNodeKind() && Navigator.haveSameName(node, origin)); } /** * Test whether the NameTest matches a given QName * * @param qname the QName to be matched * @return true if the name matches */ public boolean matches(StructuredQName qname) { return NameOfNode.makeName(origin).getStructuredQName().equals(qname); } /** * Determine the default priority of this node test when used on its own as a Pattern */ public final double getDefaultPriority() { return 0.0; } /** * Get the fingerprint required */ public int getFingerprint() { if (origin instanceof FingerprintedNode) { return ((FingerprintedNode)origin).getFingerprint(); } else { NamePool pool = origin.getConfiguration().getNamePool(); return pool.allocate(origin.getPrefix(), origin.getURI(), origin.getLocalPart()); } } /** * Determine the types of nodes to which this pattern applies. Used for optimisation. * For patterns that match nodes of several types, return Type.NODE * * @return the type of node matched by this pattern. e.g. Type.ELEMENT or Type.TEXT */ public int getPrimitiveType() { return origin.getNodeKind(); } /** * Get a mask indicating which kinds of nodes this NodeTest can match. This is a combination * of bits: 1<




© 2015 - 2025 Weber Informatics LLC | Privacy Policy