// // 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
// // 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); }
// // 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); }