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

net.sf.saxon.s9api.QName Maven / Gradle / Ivy

There is a newer version: 10.5
Show newest version
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2013 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.s9api;

import net.sf.saxon.lib.NamespaceConstant;
import net.sf.saxon.om.InscopeNamespaceResolver;
import net.sf.saxon.om.NameChecker;
import net.sf.saxon.om.NodeInfo;
import net.sf.saxon.om.StructuredQName;
import net.sf.saxon.trans.XPathException;

/**
 * The QName class represents an instance of xs:QName, as defined in the XPath 2.0 data model.
 * Internally, it has three components, a namespace URI, a local name, and a prefix. The prefix
 * is intended to be used only when converting the value back to a string.
 *
 * 

This class also defines a number of QName-valued constants relating to built-in types in * XML Schema

* *

A QName is immutable.

* *

Note that a QName is not itself an {@link XdmItem} in this model; however it can be wrapped in an * XdmItem.

*/ public class QName { private StructuredQName sqName; /** * Construct a QName using a namespace prefix, a namespace URI, and a local name (in that order). *

This constructor does not check that the components of the QName are lexically valid.

* * @param prefix The prefix of the name. Use either the string "" or null for names that have * no prefix (that is, they are in the default namespace) * @param uri The namespace URI. Use either the string "" or null for names that are not in any namespace. * @param localName The local part of the name */ public QName(String prefix, String uri, String localName) { sqName = new StructuredQName(prefix, uri, localName); } /** * Construct a QName using a namespace URI and a lexical representation. The lexical representation * may be a local name on its own, or it may be in the form prefix:local-name. *

This constructor does not check that the components of the QName are lexically valid.

* * @param uri The namespace URI. Use either the string "" or null for names that are not in any namespace. * @param lexical Either the local part of the name, or the prefix and local part in the format prefix:local */ public QName(String uri, String lexical) { uri = (uri == null ? "" : uri); int colon = lexical.indexOf(':'); if (colon < 0) { sqName = new StructuredQName("", uri, lexical); } else { String prefix = lexical.substring(0, colon); String local = lexical.substring(colon + 1); sqName = new StructuredQName(prefix, uri, local); } } /** * Construct a QName from a localName alone. The localName must not contain a colon. * The resulting QName represents a name in no namespace (which therefore has no prefix)

* * @param localName The local name. This must be a valid NCName, in particular it must contain no colon */ public QName(String localName) { int colon = localName.indexOf(':'); if (colon < 0) { sqName = new StructuredQName("", "", localName); } else { throw new IllegalArgumentException("Local name contains a colon"); } } /** * Construct a QName from a lexical QName, supplying an element node whose * in-scope namespaces are to be used to resolve any prefix contained in the QName. * *

This constructor checks that the components of the QName are * lexically valid.

*

If the lexical QName has no prefix, the name is considered to be in the * default namespace, as defined by xmlns="...".

*

If the prefix of the lexical QName is not in scope, returns null.

* * @param lexicalQName The lexical QName, in the form prefix:local * or simply local. The EQName syntax "Q{uri}local" * and the ClarkName syntax "{uri}local" are also accepted. * @param element The element node whose in-scope namespaces are to be used * to resolve the prefix part of the lexical QName. * @throws IllegalArgumentException If the prefix of the lexical QName is not in scope * or if the lexical QName is invalid (for example, if it contains invalid characters) */ public QName(String lexicalQName, XdmNode element) { if (lexicalQName.startsWith("{")) { lexicalQName = "Q" + lexicalQName; } try { NodeInfo node = (NodeInfo) element.getUnderlyingValue(); sqName = StructuredQName.fromLexicalQName(lexicalQName, true, true, node.getConfiguration().getNameChecker(), new InscopeNamespaceResolver(node)); } catch (XPathException err) { throw new IllegalArgumentException(err); } } /** * Construct a QName from a JAXP QName object * * @param qName the JAXP QName object */ public QName(javax.xml.namespace.QName qName) { sqName = new StructuredQName(qName.getPrefix(), qName.getNamespaceURI(), qName.getLocalPart()); } /** * Protected constructor accepting a StructuredQName * @param sqName the StructuredQName */ protected QName(StructuredQName sqName) { this.sqName = sqName; } /** * Factory method to construct a QName from a string containing the expanded * QName in Clark notation, that is, {uri}local *

* The prefix part of the QName will be set to an empty string. *

* * @param expandedName The URI in Clark notation: {uri}local if the * name is in a namespace, or simply local if not. * @return the QName corresponding to the supplied name in Clark notation. This will always * have an empty prefix. */ public static QName fromClarkName(String expandedName) { String namespaceURI; String localName; if (expandedName.charAt(0) == '{') { int closeBrace = expandedName.indexOf('}'); if (closeBrace < 0) { throw new IllegalArgumentException("No closing '}' in Clark name"); } namespaceURI = expandedName.substring(1, closeBrace); if (closeBrace == expandedName.length()) { throw new IllegalArgumentException("Missing local part in Clark name"); } localName = expandedName.substring(closeBrace + 1); } else { namespaceURI = ""; localName = expandedName; } return new QName("", namespaceURI, localName); } /** * Factory method to construct a QName from a string containing the expanded * QName in EQName notation, that is, Q{uri}local *

* The prefix part of the QName will be set to an empty string. *

* * @param expandedName The URI in EQName notation: {uri}local if the * name is in a namespace. For a name in no namespace, either of the * forms Q{}local or simply local are accepted. * @return the QName corresponding to the supplied name in EQName notation. This will always * have an empty prefix. */ public static QName fromEQName(String expandedName) { String namespaceURI; String localName; if (expandedName.charAt(0) == 'Q' && expandedName.charAt(1) == '{') { int closeBrace = expandedName.indexOf('}'); if (closeBrace < 0) { throw new IllegalArgumentException("No closing '}' in EQName"); } namespaceURI = expandedName.substring(2, closeBrace); if (closeBrace == expandedName.length()) { throw new IllegalArgumentException("Missing local part in EQName"); } localName = expandedName.substring(closeBrace + 1); } else { namespaceURI = ""; localName = expandedName; } return new QName("", namespaceURI, localName); } /** * Validate the QName against the XML 1.0 or XML 1.1 rules for valid names. * * @param processor The Processor in which the name is to be validated. * This determines whether the XML 1.0 or XML 1.1 rules for forming names are used. * @return true if the name is valid, false if not */ public boolean isValid(Processor processor) { NameChecker nc = processor.getUnderlyingConfiguration().getNameChecker(); String prefix = getPrefix(); if (prefix.length() > 0) { if (!nc.isValidNCName(prefix)) { return false; } } return nc.isValidNCName(getLocalName()); } /** * Get the prefix of the QName. This plays no role in operations such as comparison * of QNames for equality, but is retained (as specified in XPath) so that a string representation * can be reconstructed. *

* Returns the zero-length string in the case of a QName that has no prefix. *

* @return the prefix part of the QName, or "" if the name has no known prefix */ public String getPrefix() { return sqName.getPrefix(); } /** * The namespace URI of the QName. Returns "" (the zero-length string) if the * QName is not in a namespace. * @return the namespace part of the QName, or "" for a name in no namespace */ public String getNamespaceURI() { return sqName.getURI(); } /** * The local part of the QName * @return the local part of the QName */ public String getLocalName() { return sqName.getLocalPart(); } /** * The expanded name, as a string using the notation devised by James Clark. * If the name is in a namespace, the resulting string takes the form {uri}local. * Otherwise, the value is the local part of the name. * @return the name in Clark notation. If the name is not in a namespace, returns the * local part of the name. Otherwise returns the concatenation of "{", the namespace part * of the QName, "}", and the local part of the QName. */ public String getClarkName() { String uri = getNamespaceURI(); if (uri.length() == 0) { return getLocalName(); } else { return "{" + uri + "}" + getLocalName(); } } /** * Convert the value to a string. The resulting string is the lexical form of the QName, * using the original prefix if there was one. */ public String toString() { return sqName.getDisplayName(); } /** * Get a hash code for the QName, to support equality matching. This supports the * semantics of equality, which considers only the namespace URI and local name, and * not the prefix. * @return a hashCode for the QName */ public int hashCode() { return sqName.hashCode(); } /** * Test whether two QNames are equal. This supports the * semantics of equality, which considers only the namespace URI and local name, and * not the prefix. * @return true if the namespace URIs are equal and the local parts are equal, when * compared character-by-character. */ public boolean equals(Object other) { return other instanceof QName && sqName.equals(((QName)other).sqName); } /** * Get the underlying StructuredQName * @return the underlying StructuredQName */ protected StructuredQName getStructuredQName() { return sqName; } /** QName denoting the schema type xs:string **/ public static final QName XS_STRING = new QName("xs", NamespaceConstant.SCHEMA, "string"); /** QName denoting the schema type xs:boolean **/ public static final QName XS_BOOLEAN = new QName("xs", NamespaceConstant.SCHEMA, "boolean"); /** QName denoting the schema type xs:decimal **/ public static final QName XS_DECIMAL = new QName("xs", NamespaceConstant.SCHEMA, "decimal"); /** QName denoting the schema type xs:float **/ public static final QName XS_FLOAT = new QName("xs", NamespaceConstant.SCHEMA, "float"); /** QName denoting the schema type xs:double **/ public static final QName XS_DOUBLE = new QName("xs", NamespaceConstant.SCHEMA, "double"); /** QName denoting the schema type xs:duration **/ public static final QName XS_DURATION = new QName("xs", NamespaceConstant.SCHEMA, "duration"); /** QName denoting the schema type xs:dateTime **/ public static final QName XS_DATE_TIME = new QName("xs", NamespaceConstant.SCHEMA, "dateTime"); /** QName denoting the schema type xs:time **/ public static final QName XS_TIME = new QName("xs", NamespaceConstant.SCHEMA, "time"); /** QName denoting the schema type xs:date **/ public static final QName XS_DATE = new QName("xs", NamespaceConstant.SCHEMA, "date"); /** QName denoting the schema type xs:gYearMonth **/ public static final QName XS_G_YEAR_MONTH = new QName("xs", NamespaceConstant.SCHEMA, "gYearMonth"); /** QName denoting the schema type xs:gYear **/ public static final QName XS_G_YEAR = new QName("xs", NamespaceConstant.SCHEMA, "gYear"); /** QName denoting the schema type xs:gMonthDay **/ public static final QName XS_G_MONTH_DAY = new QName("xs", NamespaceConstant.SCHEMA, "gMonthDay"); /** QName denoting the schema type xs:gDay **/ public static final QName XS_G_DAY = new QName("xs", NamespaceConstant.SCHEMA, "gDay"); /** QName denoting the schema type xs:gMonth **/ public static final QName XS_G_MONTH = new QName("xs", NamespaceConstant.SCHEMA, "gMonth"); /** QName denoting the schema type xs:hexBinary **/ public static final QName XS_HEX_BINARY = new QName("xs", NamespaceConstant.SCHEMA, "hexBinary"); /** QName denoting the schema type xs:base64Binary **/ public static final QName XS_BASE64_BINARY = new QName("xs", NamespaceConstant.SCHEMA, "base64Binary"); /** QName denoting the schema type xs:anyURI **/ public static final QName XS_ANY_URI = new QName("xs", NamespaceConstant.SCHEMA, "anyURI"); /** QName denoting the schema type xs:QName **/ public static final QName XS_QNAME = new QName("xs", NamespaceConstant.SCHEMA, "QName"); /** QName denoting the schema type xs:NOTATION **/ public static final QName XS_NOTATION = new QName("xs", NamespaceConstant.SCHEMA, "NOTATION"); /** QName denoting the schema type xs:integer **/ public static final QName XS_INTEGER = new QName("xs", NamespaceConstant.SCHEMA, "integer"); /** QName denoting the schema type xs:nonPositiveInteger **/ public static final QName XS_NON_POSITIVE_INTEGER = new QName("xs", NamespaceConstant.SCHEMA, "nonPositiveInteger"); /** QName denoting the schema type xs:negativeInteger **/ public static final QName XS_NEGATIVE_INTEGER = new QName("xs", NamespaceConstant.SCHEMA, "negativeInteger"); /** QName denoting the schema type xs:long **/ public static final QName XS_LONG = new QName("xs", NamespaceConstant.SCHEMA, "long"); /** QName denoting the schema type xs:int **/ public static final QName XS_INT = new QName("xs", NamespaceConstant.SCHEMA, "int"); /** QName denoting the schema type xs:short **/ public static final QName XS_SHORT = new QName("xs", NamespaceConstant.SCHEMA, "short"); /** QName denoting the schema type xs:byte **/ public static final QName XS_BYTE = new QName("xs", NamespaceConstant.SCHEMA, "byte"); /** QName denoting the schema type xs:nonNegativeInteger **/ public static final QName XS_NON_NEGATIVE_INTEGER = new QName("xs", NamespaceConstant.SCHEMA, "nonNegativeInteger"); /** QName denoting the schema type xs:positiveInteger **/ public static final QName XS_POSITIVE_INTEGER = new QName("xs", NamespaceConstant.SCHEMA, "positiveInteger"); /** QName denoting the schema type xs:unsignedLong **/ public static final QName XS_UNSIGNED_LONG = new QName("xs", NamespaceConstant.SCHEMA, "unsignedLong"); /** QName denoting the schema type xs:unsignedInt **/ public static final QName XS_UNSIGNED_INT = new QName("xs", NamespaceConstant.SCHEMA, "unsignedInt"); /** QName denoting the schema type xs:unsignedShort **/ public static final QName XS_UNSIGNED_SHORT = new QName("xs", NamespaceConstant.SCHEMA, "unsignedShort"); /** QName denoting the schema type xs:unsignedByte **/ public static final QName XS_UNSIGNED_BYTE = new QName("xs", NamespaceConstant.SCHEMA, "unsignedByte"); /** QName denoting the schema type xs:normalizedString **/ public static final QName XS_NORMALIZED_STRING = new QName("xs", NamespaceConstant.SCHEMA, "normalizedString"); /** QName denoting the schema type xs:token **/ public static final QName XS_TOKEN = new QName("xs", NamespaceConstant.SCHEMA, "token"); /** QName denoting the schema type xs:language **/ public static final QName XS_LANGUAGE = new QName("xs", NamespaceConstant.SCHEMA, "language"); /** QName denoting the schema type xs:NMTOKEN **/ public static final QName XS_NMTOKEN = new QName("xs", NamespaceConstant.SCHEMA, "NMTOKEN"); /** QName denoting the schema type xs:NMTOKENS **/ public static final QName XS_NMTOKENS = new QName("xs", NamespaceConstant.SCHEMA, "NMTOKENS"); /** QName denoting the schema type xs:Name **/ public static final QName XS_NAME = new QName("xs", NamespaceConstant.SCHEMA, "Name"); /** QName denoting the schema type xs:NCName **/ public static final QName XS_NCNAME = new QName("xs", NamespaceConstant.SCHEMA, "NCName"); /** QName denoting the schema type xs:ID **/ public static final QName XS_ID = new QName("xs", NamespaceConstant.SCHEMA, "ID"); /** QName denoting the schema type xs:IDREF **/ public static final QName XS_IDREF = new QName("xs", NamespaceConstant.SCHEMA, "IDREF"); /** QName denoting the schema type xs:IDREFS **/ public static final QName XS_IDREFS = new QName("xs", NamespaceConstant.SCHEMA, "IDREFS"); /** QName denoting the schema type xs:ENTITY **/ public static final QName XS_ENTITY = new QName("xs", NamespaceConstant.SCHEMA, "ENTITY"); /** QName denoting the schema type xs:ENTITIES **/ public static final QName XS_ENTITIES = new QName("xs", NamespaceConstant.SCHEMA, "ENTITIES"); /** QName denoting the schema type xs:untyped **/ public static final QName XS_UNTYPED = new QName("xs", NamespaceConstant.SCHEMA, "untyped"); /** QName denoting the schema type xs:untypedAtomic **/ public static final QName XS_UNTYPED_ATOMIC = new QName("xs", NamespaceConstant.SCHEMA, "untypedAtomic"); /** QName denoting the schema type xs:anyAtomicType **/ public static final QName XS_ANY_ATOMIC_TYPE = new QName("xs", NamespaceConstant.SCHEMA, "anyAtomicType"); /** QName denoting the schema type xs:yearMonthDuration **/ public static final QName XS_YEAR_MONTH_DURATION = new QName("xs", NamespaceConstant.SCHEMA, "yearMonthDuration"); /** QName denoting the schema type xs:dayTimeDuration **/ public static final QName XS_DAY_TIME_DURATION = new QName("xs", NamespaceConstant.SCHEMA, "dayTimeDuration"); /** QName denoting the schema type xs:dateTimeStamp **/ /*@NotNull*/ public static final QName XS_DATE_TIME_STAMP = new QName("xs", NamespaceConstant.SCHEMA, "dateTimeStamp"); }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy