public static object CastArg([Implict] Executive engine, object value, XQuerySequenceType destType) { XQueryContext context = (XQueryContext)engine.Owner; if (destType == XQuerySequenceType.Item) return value; if (value == Undefined.Value) { if (destType.Cardinality == XmlTypeCardinality.ZeroOrMore) return EmptyIterator.Shared; if (destType.TypeCode != XmlTypeCode.None && destType.Cardinality != XmlTypeCardinality.ZeroOrOne) throw new XQueryException(Properties.Resources.XPTY0004, "empty-sequence()", destType); return Undefined.Value; } if (destType.Cardinality == XmlTypeCardinality.One || destType.Cardinality == XmlTypeCardinality.ZeroOrOne) { object res; XQueryNodeIterator iter = value as XQueryNodeIterator; if (iter != null) { iter = iter.Clone(); if (!iter.MoveNext()) { if (destType.TypeCode != XmlTypeCode.None && (destType.Cardinality == XmlTypeCardinality.One || destType.Cardinality == XmlTypeCardinality.OneOrMore)) throw new XQueryException(Properties.Resources.XPTY0004, "empty-sequence()", destType); return Undefined.Value; } if (destType.IsNode) { if (!destType.Match(iter.Current, context)) throw new XQueryException(Properties.Resources.XPTY0004, new XQuerySequenceType(iter.Current.XmlType, XmlTypeCardinality.OneOrMore, null), destType); res = iter.Current.Clone(); } else res = XQueryConvert.ValueAs(iter.Current.TypedValue, destType, context.nameTable, context.NamespaceManager); if (iter.MoveNext()) throw new XQueryException(Properties.Resources.MoreThanOneItem); return res; } else { XPathItem item = value as XPathItem; if (item != null) { if (item.IsNode) { if (!destType.Match(item, context)) throw new XQueryException(Properties.Resources.XPTY0004, new XQuerySequenceType(item.XmlType, XmlTypeCardinality.OneOrMore, null), destType); return item; } else return XQueryConvert.ValueAs(item.TypedValue, destType, context.nameTable, context.NamespaceManager); } return XQueryConvert.ValueAs(value, destType, context.nameTable, context.NamespaceManager); } } else return new NodeIterator(XPathFactory.ValueIterator(XQueryNodeIterator.Create(value), destType, context)); }
public static bool InstanceOf([Implict] Executive engine, object value, XQuerySequenceType destType) { XQueryContext context = (XQueryContext)engine.Owner; if (value == Undefined.Value) return destType.Cardinality == XmlTypeCardinality.ZeroOrOne || destType.Cardinality == XmlTypeCardinality.ZeroOrMore; if (value == null) value = CoreServices.Generation.RuntimeOps.False; XQueryNodeIterator iter = value as XQueryNodeIterator; if (iter != null) { int num = 0; foreach (XPathItem item in iter) { if (num == 1) { if (destType.Cardinality == XmlTypeCardinality.ZeroOrOne || destType.Cardinality == XmlTypeCardinality.One) return false; } if (!destType.Match(item, context)) return false; num++; } if (num == 0) { if (destType.TypeCode != XmlTypeCode.None && (destType.Cardinality == XmlTypeCardinality.One || destType.Cardinality == XmlTypeCardinality.OneOrMore)) return false; } return true; } else { if (destType.ItemType == value.GetType()) return true; XPathItem item = value as XPathItem; if (item == null) item = new XQueryItem(value); return destType.Match(item, context); } }