示例#1
0
        //
        // boolean boolean(object)
        // Number: NaN, 0 -> false
        // String: Length = 0 -> false
        // Node-set: empty -> false
        //
        // <Root><e a='1'>text</e></Root>
        // 1). /Root/e[boolean(2)]
        // 2). /Root/e[boolean[string(child::text)]
        // 3). /Root/e[boolean(child::text)]
        internal Boolean toBoolean(XPathReader reader)
        {
            Boolean ret = true;

            object obj = _qy.GetValue(reader);

            if (obj is System.Double)
            {
                double number = Convert.ToDouble(obj);
                if (number == 0 || number == double.NaN)
                {
                    ret = false;
                }
            }
            else if (obj is System.String)
            {
                if (obj.ToString().Length == 0)
                {
                    ret = false;
                }
            }
            else if (obj is System.Boolean)
            {
                ret = Convert.ToBoolean(obj);
            }
            else if (obj == null && reader.NodeType != XmlNodeType.EndElement)
            {
                ret = false;
            }

            return(ret);
        } // toBoolean
示例#2
0
        //
        // number number(object?)
        // string: IEEE 754, NaN
        // boolean: true 1, false 0
        // node-set: number(string(node-set))
        //
        // <Root><e a='1'/></Root>
        // /Root/e[@a=number('1')]
        // /Root/e[number(@a)=1]

        private double Number(XPathReader reader)
        {
            if (_qy != null)
            {
                object obj = _qy.GetValue(reader);

                if (obj == null)
                {
                    return(double.NaN);
                }

                return(Convert.ToDouble(obj));
            }
            return(double.NaN);
        }
示例#3
0
        //
        // string string(object?)
        // object
        // node-set: string value of the first node
        //           node-set = null, String.Empty return
        // number: NaN -> "NaN"
        //         +0->"0", -0->"0",
        //         +infinity -> "Infinity" -infinity -> "Infinity"
        // boolean: true -> "ture" false -> "false"
        //
        // Example: <Root><e a1='1' a2='2'/>text1</e>
        //                <e a='12'> text2</e>
        //          </Root>
        // /Root/e[string(self::node())="text"]
        // /Root/e[string(attribute::node())='1']
        // /Root[string(/e)="text"]

        private String toString(XPathReader reader)
        {
            if (this.argList != null && this.argList.Count > 0)
            {
                IQuery query = (IQuery)this.argList[0];

                object obj = query.GetValue(reader);

                if (obj == null)
                {
                    return(String.Empty);
                }

                return(obj.ToString());
            }
            return(String.Empty);
        }