Beispiel #1
0
        /// <summary>
        /// Evaluate the query, returning the result as an <c>XdmValue</c> (that is,
        /// a sequence of nodes and/or atomic values).
        /// </summary>
        /// <returns>
        /// An <c>XdmValue</c> representing the results of the query
        /// </returns>
        /// <exception cref="DynamicError">Throws a DynamicError if any run-time failure
        /// occurs while evaluating the query.</exception>

        public XdmValue Evaluate()
        {
            try
            {
                JGroundedValue value = JSequenceExtent.makeSequenceExtent(exp.iterator(context));
                return(XdmValue.Wrap(value));
            }
            catch (JXPathException err)
            {
                throw new DynamicError(err);
            }
        }
Beispiel #2
0
        private bool assertXml(XdmNode assertion, SingleResultDoc result, XPathCompiler assertXpc, XPathCompiler catalogXpc, bool debug)
        {
            if (IsException())
            {
                return(false);
            }
            else
            {
                string normalizeAtt   = assertion.GetAttributeValue(new QName("normalize-space"));
                bool   normalize      = normalizeAtt != null && ("true".Equals(normalizeAtt.Trim()) || "1".Equals(normalizeAtt.Trim()));
                string ignoreAtt      = assertion.GetAttributeValue(new QName("ignore-prefixes"));
                bool   ignorePrefixes = ignoreAtt != null && ("true".Equals(ignoreAtt.Trim()) || "1".Equals(ignoreAtt.Trim()));
                string xmlVersion     = assertion.GetAttributeValue(new QName("xml-version"));
                bool   xml11          = "1.1".Equals(xmlVersion);

                string comparand = catalogXpc.Evaluate("if (@file) then unparsed-text(resolve-uri(@file, base-uri(.))) else string(.)", assertion).ToString();
                if (comparand.StartsWith("<?xml"))
                {
                    int index = comparand.IndexOf("?>");
                    comparand = comparand.Substring(index + 2);
                }
                comparand = comparand.Trim();
                comparand = comparand.Replace("\r\n", "\n");
                if (normalize)
                {
                    comparand = JWhitespace.collapseWhitespace(comparand).ToString();
                }

                if (comparand.Equals(Serialize(assertXpc.Processor, result)))
                {
                    return(true);
                }

                DocumentBuilder builder = assertXpc.Processor.NewDocumentBuilder();
                if (xml11)
                {
                    assertXpc.Processor.SetProperty(JFeatureKeys.XML_VERSION, "1.1");
                }
                StringReader reader = new StringReader((xml11 ? "<?xml version='1.1'?>" : "") + "<z>" + comparand + "</z>");
                builder.BaseUri = assertion.BaseUri;
                XdmNode expected = builder.Build(reader);

                int flag = 0;

                flag |= JDeepEqual.INCLUDE_COMMENTS;
                flag |= JDeepEqual.INCLUDE_PROCESSING_INSTRUCTIONS;
                flag |= JDeepEqual.EXCLUDE_VARIETY;
                if (!ignorePrefixes)
                {
                    flag |= JDeepEqual.INCLUDE_NAMESPACES;
                    flag |= JDeepEqual.INCLUDE_PREFIXES;
                }
                flag |= JDeepEqual.COMPARE_STRING_VALUES;
                if (debug)
                {
                    flag |= JDeepEqual.WARNING_IF_FALSE;
                }
                try {
                    JSequenceIterator iter0;
                    if (result == null)
                    {
                        System.Console.WriteLine("Result value is null");
                        return(false);
                    }
                    XdmValue value = result.value;

                    if (value == null)
                    {
                        System.Console.WriteLine("Result value is null (perhaps serialized?)");
                        return(false);
                    }
                    if (value.Count == 1 && value.Simplify is XdmNode && ((XdmNode)value.Simplify).NodeKind == System.Xml.XmlNodeType.Document)
                    {
                        iter0 = ((XdmNode)value.Simplify).Implementation.iterateAxis(JAxisInfo.CHILD);
                    }
                    else
                    {
                        iter0 = value.Unwrap().iterate();
                    }
                    JGroundedValue    val0  = net.sf.saxon.value.SequenceExtent.makeSequenceExtent(iter0);
                    JSequenceIterator iter1 = expected.Implementation.iterateAxis(JAxisInfo.CHILD).next().iterateAxis(JAxisInfo.CHILD);
                    JGroundedValue    val1  = net.sf.saxon.value.SequenceExtent.makeSequenceExtent(iter1);
                    bool success            = JDeepEqual.deepEqual(
                        iter0, iter1,
                        new JGenericAtomicComparer(JCodepointCollator.getInstance(), null),
                        assertXpc.Processor.Implementation.getConversionContext(), flag);
                    // if necessary try again ignoring whitespace nodes
                    if (!success)
                    {
                        iter0 = val0.iterate();
                        iter1 = val1.iterate();
                        // deep-equals with the EXCLUDE_WHITESPACE flag doesn't ignore top-level whitespace, so we
                        // need to filter that out ourselves
                        iter0   = new JItemMappingIterator(iter0, new RemoveWhitespace());
                        iter1   = new JItemMappingIterator(iter1, new RemoveWhitespace());
                        success = JDeepEqual.deepEqual(
                            iter0, iter1,
                            new JGenericAtomicComparer(JCodepointCollator.getInstance(), null),
                            assertXpc.Processor.Implementation.getConversionContext(),
                            flag | JDeepEqual.EXCLUDE_WHITESPACE_TEXT_NODES);
                        if (success)
                        {
                            comment = "OK after ignoring whitespace text";
                        }
                    }
                    if (!success)
                    {
                        System.Console.WriteLine("assert-xml comparison failed");
                        if (debug)
                        {
                            System.Console.WriteLine("assert-xml comparison failed");
                            System.Console.WriteLine("Reference results:");
                            System.Console.WriteLine(expected.ToString());
                            System.Console.WriteLine("Actual results:");
                            //System.Console.WriteLine(result.serialization);
                            System.Console.WriteLine(value.ToString());
                        }
                    }
                    return(success);
                } catch (DynamicError e) {
                    Console.WriteLine(e.StackTrace);
                    return(false);
                }
            }
        }