Ejemplo n.º 1
0
 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));
 }
Ejemplo n.º 2
0
 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);
     }
 }