public bool Match(XPathItem item, XQueryContext context) { switch (TypeCode) { case XmlTypeCode.None: return false; case XmlTypeCode.Item: return true; case XmlTypeCode.Node: return item.IsNode; case XmlTypeCode.AnyAtomicType: return !item.IsNode; case XmlTypeCode.UntypedAtomic: return !item.IsNode && item.XmlType == XmlSchema.UntypedAtomic; case XmlTypeCode.Document: { XPathNavigator nav = item as XPathNavigator; if (nav != null) { if (nav.NodeType == XPathNodeType.Root) { XPathNavigator cur = nav.Clone(); if (SchemaElement == null) { if (cur.MoveToChild(XPathNodeType.Element) && MatchName(cur, context)) { if (SchemaType == null || SchemaType == XmlSchema.UntypedAtomic) return true; IXmlSchemaInfo schemaInfo = cur.SchemaInfo; if (schemaInfo != null) { if (XmlSchemaType.IsDerivedFrom(schemaInfo.SchemaType, SchemaType, XmlSchemaDerivationMethod.Empty)) return !schemaInfo.IsNil || Nillable; } else return XmlSchemaType.IsDerivedFrom(XmlSchema.UntypedAtomic, SchemaType, XmlSchemaDerivationMethod.Empty); } } else { if (!cur.MoveToChild(XPathNodeType.Element)) return false; IXmlSchemaInfo schemaInfo = cur.SchemaInfo; if (schemaInfo != null) return schemaInfo.SchemaElement.QualifiedName == SchemaElement.QualifiedName; } } } } break; case XmlTypeCode.Element: { XPathNavigator nav = item as XPathNavigator; if (nav != null && nav.NodeType == XPathNodeType.Element) { if (SchemaElement == null) { if (MatchName(nav, context)) { if (SchemaType == null || SchemaType == XmlSchema.UntypedAtomic) return true; IXmlSchemaInfo schemaInfo = nav.SchemaInfo; if (schemaInfo != null) { if (XmlSchemaType.IsDerivedFrom(schemaInfo.SchemaType, SchemaType, XmlSchemaDerivationMethod.Empty)) return !schemaInfo.IsNil || Nillable; } else return XmlSchemaType.IsDerivedFrom(XmlSchema.UntypedAtomic, SchemaType, XmlSchemaDerivationMethod.Empty); } } else { IXmlSchemaInfo schemaInfo = nav.SchemaInfo; if (schemaInfo != null) return schemaInfo.SchemaElement.QualifiedName == SchemaElement.QualifiedName; } } } break; case XmlTypeCode.Attribute: { XPathNavigator nav = item as XPathNavigator; if (nav != null && nav.NodeType == XPathNodeType.Attribute) { if (SchemaAttribute == null) { if (MatchName(nav, context)) { if (SchemaType == null || SchemaType == XmlSchema.UntypedAtomic) return true; IXmlSchemaInfo schemaInfo = nav.SchemaInfo; if (schemaInfo == null) return XmlSchemaType.IsDerivedFrom(XmlSchema.UntypedAtomic, SchemaType, XmlSchemaDerivationMethod.Empty); else return XmlSchemaType.IsDerivedFrom(schemaInfo.SchemaType, SchemaType, XmlSchemaDerivationMethod.Empty); } } else { IXmlSchemaInfo schemaInfo = nav.SchemaInfo; if (schemaInfo != null) return schemaInfo.SchemaAttribute.QualifiedName == SchemaAttribute.QualifiedName; } } } break; case XmlTypeCode.ProcessingInstruction: { XPathNavigator nav = item as XPathNavigator; if (nav != null) return (nav.NodeType == XPathNodeType.ProcessingInstruction && (NameTest.IsNameWildcard || NameTest.Name == nav.Name)); } break; case XmlTypeCode.Comment: { XPathNavigator nav = item as XPathNavigator; if (nav != null) return nav.NodeType == XPathNodeType.Comment; } break; case XmlTypeCode.Text: { XPathNavigator nav = item as XPathNavigator; if (nav != null) return nav.NodeType == XPathNodeType.Text || nav.NodeType == XPathNodeType.SignificantWhitespace; } break; case XmlTypeCode.PositiveInteger: switch (item.XmlType.TypeCode) { case XmlTypeCode.Byte: case XmlTypeCode.Short: case XmlTypeCode.Int: case XmlTypeCode.Long: case XmlTypeCode.Integer: return (decimal)item.ValueAs(typeof(System.Decimal)) > 0; } break; case XmlTypeCode.NegativeInteger: switch (item.XmlType.TypeCode) { case XmlTypeCode.Byte: case XmlTypeCode.Short: case XmlTypeCode.Int: case XmlTypeCode.Long: case XmlTypeCode.Integer: return (decimal)item.ValueAs(typeof(System.Decimal)) < 0; } break; case XmlTypeCode.NonPositiveInteger: switch (item.XmlType.TypeCode) { case XmlTypeCode.Byte: case XmlTypeCode.Short: case XmlTypeCode.Int: case XmlTypeCode.Long: case XmlTypeCode.Integer: return (decimal)item.ValueAs(typeof(System.Decimal)) <= 0; } break; case XmlTypeCode.NonNegativeInteger: switch (item.XmlType.TypeCode) { case XmlTypeCode.Byte: case XmlTypeCode.Short: case XmlTypeCode.Int: case XmlTypeCode.Long: case XmlTypeCode.Integer: return (decimal)item.ValueAs(typeof(System.Decimal)) >= 0; case XmlTypeCode.UnsignedByte: case XmlTypeCode.UnsignedShort: case XmlTypeCode.UnsignedInt: case XmlTypeCode.UnsignedLong: return true; } break; case XmlTypeCode.Integer: switch (item.XmlType.TypeCode) { case XmlTypeCode.Byte: case XmlTypeCode.Short: case XmlTypeCode.Int: case XmlTypeCode.Long: case XmlTypeCode.Integer: case XmlTypeCode.UnsignedByte: case XmlTypeCode.UnsignedShort: case XmlTypeCode.UnsignedInt: case XmlTypeCode.UnsignedLong: return true; case XmlTypeCode.Decimal: decimal value = (decimal)item.ValueAs(typeof(System.Decimal)); return value == Math.Truncate(value); } break; case XmlTypeCode.Entity: return (item.XmlType.TypeCode == XmlTypeCode.String) || (item.XmlType.TypeCode == XmlTypeCode.Entity); default: { if (item.XmlType != null) return XmlSchemaType.IsDerivedFrom(item.XmlType, SchemaType, XmlSchemaDerivationMethod.Empty); } break; } return false; }