diff options
| author | Bob Jamison <ishmalius@gmail.com> | 2006-05-21 21:51:51 +0000 |
|---|---|---|
| committer | ishmal <ishmal@users.sourceforge.net> | 2006-05-21 21:51:51 +0000 |
| commit | 12c02a7a645e0bc0a2acdddfe3fdb9911b8c6a61 (patch) | |
| tree | 2ab648845475b57afc3837bf1883b8785861d95e /src/dom/work/testxpath.cpp | |
| parent | Check if we are already SSL before trying STARTTLS (diff) | |
| download | inkscape-12c02a7a645e0bc0a2acdddfe3fdb9911b8c6a61.tar.gz inkscape-12c02a7a645e0bc0a2acdddfe3fdb9911b8c6a61.zip | |
Unix-ify the sources
(bzr r928)
Diffstat (limited to 'src/dom/work/testxpath.cpp')
| -rw-r--r-- | src/dom/work/testxpath.cpp | 2832 |
1 files changed, 1416 insertions, 1416 deletions
diff --git a/src/dom/work/testxpath.cpp b/src/dom/work/testxpath.cpp index d724600a7..b8551f2de 100644 --- a/src/dom/work/testxpath.cpp +++ b/src/dom/work/testxpath.cpp @@ -1,1416 +1,1416 @@ -/**
- * Phoebe DOM Implementation.
- *
- * This is a C++ approximation of the W3C DOM model, which follows
- * fairly closely the specifications in the various .idl files, copies of
- * which are provided for reference. Most important is this one:
- *
- * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/idl-definitions.html
- *
- * Authors:
- * Bob Jamison
- *
- * Copyright (C) 2005 Bob Jamison
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-
-
-#include "dom.h"
-#include "lsimpl.h"
-#include "xpathparser.h"
-
-#include <stdio.h>
-
-using namespace org::w3c::dom;
-using namespace org::w3c::dom::xpath;
-
-
-typedef struct
-{
- char *xpathStr;
- char *desc;
- char *xml;
-} XpathTest;
-
-XpathTest xpathTests[] =
-{
-
-{
-"/AAA",
-"Select the root element AAA",
-" <AAA>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" </DDD>\n"
-" <CCC/>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/CCC",
-"Select all elements CCC which are children of the root element AAA",
-" <AAA>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" </DDD>\n"
-" <CCC/>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/DDD/BBB",
-"Select all elements BBB which are children of DDD which are children of the root element AAA",
-" <AAA>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" </DDD>\n"
-" <CCC/>\n"
-" </AAA>\n"
-},
-
-{
-"//BBB",
-"Select all elements BBB",
-" <AAA>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" <BBB/>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" </DDD>\n"
-" <CCC>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </DDD>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//DDD/BBB",
-"Select all elements BBB which are children of DDD",
-" <AAA>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" <BBB/>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" </DDD>\n"
-" <CCC>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </DDD>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/CCC/DDD/*",
-"Select all elements enclosed by elements /AAA/CCC/DDD",
-" <AAA>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <EEE/>\n"
-" <FFF/>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <EEE/>\n"
-" <FFF/>\n"
-" </DDD>\n"
-" </CCC>\n"
-" <CCC>\n"
-" <BBB>\n"
-" <BBB>\n"
-" <BBB/>\n"
-" </BBB>\n"
-" </BBB>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"/*/*/*/BBB",
-"Select all elements BBB which have 3 ancestors",
-" <AAA>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <EEE/>\n"
-" <FFF/>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <EEE/>\n"
-" <FFF/>\n"
-" </DDD>\n"
-" </CCC>\n"
-" <CCC>\n"
-" <BBB>\n"
-" <BBB>\n"
-" <BBB/>\n"
-" </BBB>\n"
-" </BBB>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//*",
-"Select all elements",
-" <AAA>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <EEE/>\n"
-" <FFF/>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <EEE/>\n"
-" <FFF/>\n"
-" </DDD>\n"
-" </CCC>\n"
-" <CCC>\n"
-" <BBB>\n"
-" <BBB>\n"
-" <BBB/>\n"
-" </BBB>\n"
-" </BBB>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/BBB[1]",
-"Select the first BBB child of element AAA",
-" <AAA>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/BBB[last()]",
-"Select the last BBB child of element AAA",
-" <AAA>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </AAA>\n"
-},
-
-{
-"//@id",
-"Select all attributes @id",
-" <AAA>\n"
-" <BBB id = 'b1'/>\n"
-" <BBB id = 'b2'/>\n"
-" <BBB name = 'bbb'/>\n"
-" <BBB/>\n"
-" </AAA>\n"
-},
-
-{
-"//BBB[@id]",
-"Select BBB elements which have attribute id",
-" <AAA>\n"
-" <BBB id = 'b1'/>\n"
-" <BBB id = 'b2'/>\n"
-" <BBB name = 'bbb'/>\n"
-" <BBB/>\n"
-" </AAA>\n"
-},
-
-{
-"//BBB[@name]",
-"Select BBB elements which have attribute name",
-" <AAA>\n"
-" <BBB id = 'b1'/>\n"
-" <BBB id = 'b2'/>\n"
-" <BBB name = 'bbb'/>\n"
-" <BBB/>\n"
-" </AAA>\n"
-},
-
-{
-"//BBB[@*]",
-"Select BBB elements which have any attribute",
-" <AAA>\n"
-" <BBB id = 'b1'/>\n"
-" <BBB id = 'b2'/>\n"
-" <BBB name = 'bbb'/>\n"
-" <BBB/>\n"
-" </AAA>\n"
-},
-
-{
-"//BBB[not(@*)]",
-"Select BBB elements without an attribute",
-" <AAA>\n"
-" <BBB id = 'b1'/>\n"
-" <BBB id = 'b2'/>\n"
-" <BBB name = 'bbb'/>\n"
-" <BBB/>\n"
-" </AAA>\n"
-},
-
-{
-"//BBB[@id='b1']",
-"Select BBB elements which have attribute id with value b1",
-" <AAA>\n"
-" <BBB id = 'b1'/>\n"
-" <BBB name = ' bbb '/>\n"
-" <BBB name = 'bbb'/>\n"
-" </AAA>\n"
-},
-
-{
-"//BBB[@name='bbb']",
-"Select BBB elements which have attribute name with value 'bbb'",
-" <AAA>\n"
-" <BBB id = 'b1'/>\n"
-" <BBB name = ' bbb '/>\n"
-" <BBB name = 'bbb'/>\n"
-" </AAA>\n"
-},
-
-{
-"//BBB[normalize-space(@name)='bbb']",
-"Select BBB elements which have attribute name with value bbb, leading and trailing spaces are removed before comparison",
-" <AAA>\n"
-" <BBB id = 'b1'/>\n"
-" <BBB name = ' bbb '/>\n"
-" <BBB name = 'bbb'/>\n"
-" </AAA>\n"
-},
-
-{
-"//*[count(BBB)=2]",
-"Select elements which have two children BBB",
-" <AAA>\n"
-" <CCC>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </CCC>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </DDD>\n"
-" <EEE>\n"
-" <CCC/>\n"
-" <DDD/>\n"
-" </EEE>\n"
-" </AAA>\n"
-},
-
-{
-"//*[count(*)=2]",
-"Select elements which have 2 children",
-" <AAA>\n"
-" <CCC>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </CCC>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </DDD>\n"
-" <EEE>\n"
-" <CCC/>\n"
-" <DDD/>\n"
-" </EEE>\n"
-" </AAA>\n"
-},
-
-{
-"//*[count(*)=3]",
-"Select elements which have 3 children",
-" <AAA>\n"
-" <CCC>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </CCC>\n"
-" <DDD>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </DDD>\n"
-" <EEE>\n"
-" <CCC/>\n"
-" <DDD/>\n"
-" </EEE>\n"
-" </AAA>\n"
-},
-
-{
-"//*[name()='BBB']",
-"Select all elements with name BBB, equivalent with //BBB",
-" <AAA>\n"
-" <BCC>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </BCC>\n"
-" <DDB>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </DDB>\n"
-" <BEC>\n"
-" <CCC/>\n"
-" <DBD/>\n"
-" </BEC>\n"
-" </AAA>\n"
-},
-
-{
-"//*[starts-with(name(),'B')]",
-"Select all elements name of which starts with letter B",
-" <AAA>\n"
-" <BCC>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </BCC>\n"
-" <DDB>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </DDB>\n"
-" <BEC>\n"
-" <CCC/>\n"
-" <DBD/>\n"
-" </BEC>\n"
-" </AAA>\n"
-},
-
-{
-"//*[contains(name(),'C')]",
-"Select all elements name of which contain letter C",
-" <AAA>\n"
-" <BCC>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </BCC>\n"
-" <DDB>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" </DDB>\n"
-" <BEC>\n"
-" <CCC/>\n"
-" <DBD/>\n"
-" </BEC>\n"
-" </AAA>\n"
-},
-
-{
-"//*[string-length(name()) = 3]",
-"Select elements with three-letter name",
-" <AAA>\n"
-" <Q/>\n"
-" <SSSS/>\n"
-" <BB/>\n"
-" <CCC/>\n"
-" <DDDDDDDD/>\n"
-" <EEEE/>\n"
-" </AAA>\n"
-},
-
-{
-"//*[string-length(name()) < 3]",
-"Select elements name of which has one or two characters",
-" <AAA>\n"
-" <Q/>\n"
-" <SSSS/>\n"
-" <BB/>\n"
-" <CCC/>\n"
-" <DDDDDDDD/>\n"
-" <EEEE/>\n"
-" </AAA>\n"
-},
-
-{
-"//*[string-length(name()) > 3]",
-"Select elements with name longer than three characters",
-" <AAA>\n"
-" <Q/>\n"
-" <SSSS/>\n"
-" <BB/>\n"
-" <CCC/>\n"
-" <DDDDDDDD/>\n"
-" <EEEE/>\n"
-" </AAA>\n"
-},
-
-{
-"//CCC | //BBB",
-"Select all elements CCC and BBB",
-" <AAA>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" <DDD>\n"
-" <CCC/>\n"
-" </DDD>\n"
-" <EEE/>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/EEE | //BBB",
-"Select all elements BBB and elements EEE which are children of root element AAA",
-" <AAA>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" <DDD>\n"
-" <CCC/>\n"
-" </DDD>\n"
-" <EEE/>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/EEE | //DDD/CCC | /AAA | //BBB",
-"Number of combinations is not restricted",
-" <AAA>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" <DDD>\n"
-" <CCC/>\n"
-" </DDD>\n"
-" <EEE/>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA",
-"Equivalent of /child::AAA",
-" <AAA>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" </AAA>\n"
-},
-
-{
-"/child::AAA",
-"Equivalent of /AAA",
-" <AAA>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/BBB",
-"Equivalent of /child::AAA/child::BBB",
-" <AAA>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" </AAA>\n"
-},
-
-{
-"/child::AAA/child::BBB",
-"Equivalent of /AAA/BBB",
-" <AAA>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" </AAA>\n"
-},
-
-{
-"/child::AAA/BBB",
-"Both possibilities can be combined",
-" <AAA>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" </AAA>\n"
-},
-
-{
-"/descendant::*",
-"Select all descendants of document root and therefore all elements",
-" <AAA>\n"
-" <BBB>\n"
-" <DDD>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" <EEE/>\n"
-" </CCC>\n"
-" </DDD>\n"
-" </BBB>\n"
-" <CCC>\n"
-" <DDD>\n"
-" <EEE>\n"
-" <DDD>\n"
-" <FFF/>\n"
-" </DDD>\n"
-" </EEE>\n"
-" </DDD>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/BBB/descendant::*",
-"Select all descendants of /AAA/BBB",
-" <AAA>\n"
-" <BBB>\n"
-" <DDD>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" <EEE/>\n"
-" </CCC>\n"
-" </DDD>\n"
-" </BBB>\n"
-" <CCC>\n"
-" <DDD>\n"
-" <EEE>\n"
-" <DDD>\n"
-" <FFF/>\n"
-" </DDD>\n"
-" </EEE>\n"
-" </DDD>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//CCC/descendant::*",
-"Select all elements which have CCC among its ancestors",
-" <AAA>\n"
-" <BBB>\n"
-" <DDD>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" <EEE/>\n"
-" </CCC>\n"
-" </DDD>\n"
-" </BBB>\n"
-" <CCC>\n"
-" <DDD>\n"
-" <EEE>\n"
-" <DDD>\n"
-" <FFF/>\n"
-" </DDD>\n"
-" </EEE>\n"
-" </DDD>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//CCC/descendant::DDD",
-"Select elements DDD which have CCC among its ancestors",
-" <AAA>\n"
-" <BBB>\n"
-" <DDD>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" <EEE/>\n"
-" </CCC>\n"
-" </DDD>\n"
-" </BBB>\n"
-" <CCC>\n"
-" <DDD>\n"
-" <EEE>\n"
-" <DDD>\n"
-" <FFF/>\n"
-" </DDD>\n"
-" </EEE>\n"
-" </DDD>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//DDD/parent::*",
-"Select all parents of DDD element",
-" <AAA>\n"
-" <BBB>\n"
-" <DDD>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" <EEE/>\n"
-" </CCC>\n"
-" </DDD>\n"
-" </BBB>\n"
-" <CCC>\n"
-" <DDD>\n"
-" <EEE>\n"
-" <DDD>\n"
-" <FFF/>\n"
-" </DDD>\n"
-" </EEE>\n"
-" </DDD>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/BBB/DDD/CCC/EEE/ancestor::*",
-"Select all elements given in this absolute path",
-" <AAA>\n"
-" <BBB>\n"
-" <DDD>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" <EEE/>\n"
-" </CCC>\n"
-" </DDD>\n"
-" </BBB>\n"
-" <CCC>\n"
-" <DDD>\n"
-" <EEE>\n"
-" <DDD>\n"
-" <FFF/>\n"
-" </DDD>\n"
-" </EEE>\n"
-" </DDD>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//FFF/ancestor::*",
-"Select ancestors of FFF element",
-" <AAA>\n"
-" <BBB>\n"
-" <DDD>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" <EEE/>\n"
-" </CCC>\n"
-" </DDD>\n"
-" </BBB>\n"
-" <CCC>\n"
-" <DDD>\n"
-" <EEE>\n"
-" <DDD>\n"
-" <FFF/>\n"
-" </DDD>\n"
-" </EEE>\n"
-" </DDD>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/BBB/following-sibling::*",
-"The following-sibling axis contains all the following siblings of the context node.",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <DDD/>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <DDD/>\n"
-" <CCC/>\n"
-" <FFF/>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//CCC/following-sibling::*",
-"The following-sibling axis contains all the following siblings of the context node.",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <DDD/>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <DDD/>\n"
-" <CCC/>\n"
-" <FFF/>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/XXX/preceding-sibling::*",
-"The preceding-sibling axis contains all the preceding siblings of the context node.",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <DDD/>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <DDD/>\n"
-" <CCC/>\n"
-" <FFF/>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//CCC/preceding-sibling::*",
-"The preceding-sibling axis contains all the preceding siblings of the context node",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <DDD/>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <DDD/>\n"
-" <CCC/>\n"
-" <FFF/>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/XXX/following::*",
-"The following axis contains all nodes in the same document as the context "
-"node that are after the context node in document order, "
-"excluding any descendants and excluding attribute nodes and namespace nodes.",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ>\n"
-" <DDD/>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" </DDD>\n"
-" </ZZZ>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <DDD/>\n"
-" <CCC/>\n"
-" <FFF/>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//ZZZ/following::*",
-"The following axis contains all nodes in the same document as the context "
-"node that are after the context node in document order, "
-"excluding any descendants and excluding attribute nodes and namespace nodes.",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ>\n"
-" <DDD/>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" </DDD>\n"
-" </ZZZ>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <DDD/>\n"
-" <CCC/>\n"
-" <FFF/>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/XXX/preceding::*",
-"The preceding axis contains all nodes in the same document as the "
-"context node that are before the context node in document order, "
-"excluding any ancestors and excluding attribute nodes and namespace nodes",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ>\n"
-" <DDD/>\n"
-" </ZZZ>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <DDD/>\n"
-" <CCC/>\n"
-" <FFF/>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//GGG/preceding::*",
-"The preceding axis contains all nodes in the same document as the "
-"context node that are before the context node in document order, "
-"excluding any ancestors and excluding attribute nodes and namespace nodes",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ>\n"
-" <DDD/>\n"
-" </ZZZ>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <DDD/>\n"
-" <CCC/>\n"
-" <FFF/>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/XXX/descendant-or-self::*",
-"The descendant-or-self axis contains the "
-"context node and the descendants of the context node",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ>\n"
-" <DDD/>\n"
-" </ZZZ>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <DDD/>\n"
-" <CCC/>\n"
-" <FFF/>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//CCC/descendant-or-self::*",
-"The descendant-or-self axis contains the "
-"context node and the descendants of the context node",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ>\n"
-" <DDD/>\n"
-" </ZZZ>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <DDD/>\n"
-" <CCC/>\n"
-" <FFF/>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"/AAA/XXX/DDD/EEE/ancestor-or-self::*",
-"The ancestor-or-self axis contains the context node and the "
-"ancestors of the context node; thus, the ancestor-or-self axis "
-"will always include the root node.",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ>\n"
-" <DDD/>\n"
-" </ZZZ>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <DDD/>\n"
-" <CCC/>\n"
-" <FFF/>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//GGG/ancestor-or-self::*",
-"The ancestor-or-self axis contains the context node and the "
-"ancestors of the context node; thus, the ancestor-or-self axis "
-"will always include the root node.",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ>\n"
-" <DDD/>\n"
-" </ZZZ>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <DDD/>\n"
-" <CCC/>\n"
-" <FFF/>\n"
-" <FFF>\n"
-" <GGG/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//GGG/ancestor::*",
-"The ancestor, descendant, following, preceding and self axes partition a document",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ/>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <FFF>\n"
-" <HHH/>\n"
-" <GGG>\n"
-" <JJJ>\n"
-" <QQQ/>\n"
-" </JJJ>\n"
-" <JJJ/>\n"
-" </GGG>\n"
-" <HHH/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//GGG/descendant::*",
-"The ancestor, descendant, following, preceding and self axes partition a document",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ/>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <FFF>\n"
-" <HHH/>\n"
-" <GGG>\n"
-" <JJJ>\n"
-" <QQQ/>\n"
-" </JJJ>\n"
-" <JJJ/>\n"
-" </GGG>\n"
-" <HHH/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//GGG/following::*",
-"The ancestor, descendant, following, preceding and self axes partition a document",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ/>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <FFF>\n"
-" <HHH/>\n"
-" <GGG>\n"
-" <JJJ>\n"
-" <QQQ/>\n"
-" </JJJ>\n"
-" <JJJ/>\n"
-" </GGG>\n"
-" <HHH/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//GGG/preceding::*",
-"The ancestor, descendant, following, preceding and self axes partition a document",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ/>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <FFF>\n"
-" <HHH/>\n"
-" <GGG>\n"
-" <JJJ>\n"
-" <QQQ/>\n"
-" </JJJ>\n"
-" <JJJ/>\n"
-" </GGG>\n"
-" <HHH/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//GGG/self::*",
-"The ancestor, descendant, following, preceding and self axes partition a document",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ/>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <FFF>\n"
-" <HHH/>\n"
-" <GGG>\n"
-" <JJJ>\n"
-" <QQQ/>\n"
-" </JJJ>\n"
-" <JJJ/>\n"
-" </GGG>\n"
-" <HHH/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//GGG/ancestor::* | //GGG/descendant::* | //GGG/following::* | //GGG/preceding::* | //GGG/self::*",
-"The ancestor, descendant, following, preceding and self axes partition a document",
-" <AAA>\n"
-" <BBB>\n"
-" <CCC/>\n"
-" <ZZZ/>\n"
-" </BBB>\n"
-" <XXX>\n"
-" <DDD>\n"
-" <EEE/>\n"
-" <FFF>\n"
-" <HHH/>\n"
-" <GGG>\n"
-" <JJJ>\n"
-" <QQQ/>\n"
-" </JJJ>\n"
-" <JJJ/>\n"
-" </GGG>\n"
-" <HHH/>\n"
-" </FFF>\n"
-" </DDD>\n"
-" </XXX>\n"
-" <CCC>\n"
-" <DDD/>\n"
-" </CCC>\n"
-" </AAA>\n"
-},
-
-{
-"//BBB[position() mod 2 = 0 ]",
-"Select even BBB elements",
-" <AAA>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" <CCC/>\n"
-" <CCC/>\n"
-" </AAA>\n"
-},
-
-{
-"//BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]",
-"Select middle BBB element(s)",
-" <AAA>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" <CCC/>\n"
-" <CCC/>\n"
-" </AAA>\n"
-},
-
-{
-"//CCC[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]",
-"Select middle CCC element(s)",
-" <AAA>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <BBB/>\n"
-" <CCC/>\n"
-" <CCC/>\n"
-" <CCC/>\n"
-" </AAA>\n"
-},
-
-{ //end data
-NULL,
-NULL,
-NULL,
-}
-
-};
-
-
-
-bool doStringTest(char *str)
-{
- XPathParser xp;
- xp.setDebug(true);
-
- if (!xp.parse(str))
- return false;
-
-
- return true;
-}
-
-
-
-bool doStringTests()
-{
- for (XpathTest *xpt = xpathTests ; xpt->xpathStr ; xpt++)
- {
- if (!doStringTest(xpt->xpathStr))
- return false;
- }
- return true;
-}
-
-void dumpDoc(Document *doc)
-{
- ls::DOMImplementationLSImpl domImpl;
- ls::LSSerializer &serializer = domImpl.createLSSerializer();
- ls::LSOutput output = domImpl.createLSOutput();
- io::StdWriter writer;
- output.setCharacterStream(&writer);
- serializer.write(doc, output);
-}
-
-
-bool doXmlTest(XpathTest *xpt)
-{
- //### READ
- ls::DOMImplementationLSImpl domImpl;
- ls::LSInput input = domImpl.createLSInput();
- ls::LSParser &parser = domImpl.createLSParser(0, "");
- input.setStringData(xpt->xml);
- Document *doc = parser.parse(input);
-
- //### XPATH
- XPathParser xp;
- xp.setDebug(true);
-
- org::w3c::dom::NodeList list = xp.evaluate(doc, xpt->xpathStr);
- for (unsigned int i=0 ; i<list.getLength() ; i++)
- {
- org::w3c::dom::Node *n = list.item(i);
- }
-
- //dumpDoc(doc);
-
- delete doc;
- return true;
-}
-
-bool doXmlTests()
-{
- for (XpathTest *xpt = xpathTests ; xpt->xpathStr ; xpt++)
- {
- if (!doXmlTest(xpt))
- return false;
- }
- return true;
-}
-
-bool doTests()
-{
- /*
- if (!doStringTests())
- {
- printf("## Failed string tests\n");
- return false;
- }
- */
- if (!doXmlTests())
- {
- printf("## Failed xml tests\n");
- return false;
- }
- return true;
-}
-
-
-
-int main(int argc, char **argv)
-{
- doTests();
- return 0;
-}
+/** + * Phoebe DOM Implementation. + * + * This is a C++ approximation of the W3C DOM model, which follows + * fairly closely the specifications in the various .idl files, copies of + * which are provided for reference. Most important is this one: + * + * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/idl-definitions.html + * + * Authors: + * Bob Jamison + * + * Copyright (C) 2005 Bob Jamison + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +#include "dom.h" +#include "lsimpl.h" +#include "xpathparser.h" + +#include <stdio.h> + +using namespace org::w3c::dom; +using namespace org::w3c::dom::xpath; + + +typedef struct +{ + char *xpathStr; + char *desc; + char *xml; +} XpathTest; + +XpathTest xpathTests[] = +{ + +{ +"/AAA", +"Select the root element AAA", +" <AAA>\n" +" <BBB/>\n" +" <CCC/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <DDD>\n" +" <BBB/>\n" +" </DDD>\n" +" <CCC/>\n" +" </AAA>\n" +}, + +{ +"/AAA/CCC", +"Select all elements CCC which are children of the root element AAA", +" <AAA>\n" +" <BBB/>\n" +" <CCC/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <DDD>\n" +" <BBB/>\n" +" </DDD>\n" +" <CCC/>\n" +" </AAA>\n" +}, + +{ +"/AAA/DDD/BBB", +"Select all elements BBB which are children of DDD which are children of the root element AAA", +" <AAA>\n" +" <BBB/>\n" +" <CCC/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <DDD>\n" +" <BBB/>\n" +" </DDD>\n" +" <CCC/>\n" +" </AAA>\n" +}, + +{ +"//BBB", +"Select all elements BBB", +" <AAA>\n" +" <BBB/>\n" +" <CCC/>\n" +" <BBB/>\n" +" <DDD>\n" +" <BBB/>\n" +" </DDD>\n" +" <CCC>\n" +" <DDD>\n" +" <BBB/>\n" +" <BBB/>\n" +" </DDD>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//DDD/BBB", +"Select all elements BBB which are children of DDD", +" <AAA>\n" +" <BBB/>\n" +" <CCC/>\n" +" <BBB/>\n" +" <DDD>\n" +" <BBB/>\n" +" </DDD>\n" +" <CCC>\n" +" <DDD>\n" +" <BBB/>\n" +" <BBB/>\n" +" </DDD>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"/AAA/CCC/DDD/*", +"Select all elements enclosed by elements /AAA/CCC/DDD", +" <AAA>\n" +" <XXX>\n" +" <DDD>\n" +" <BBB/>\n" +" <BBB/>\n" +" <EEE/>\n" +" <FFF/>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD>\n" +" <BBB/>\n" +" <BBB/>\n" +" <EEE/>\n" +" <FFF/>\n" +" </DDD>\n" +" </CCC>\n" +" <CCC>\n" +" <BBB>\n" +" <BBB>\n" +" <BBB/>\n" +" </BBB>\n" +" </BBB>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"/*/*/*/BBB", +"Select all elements BBB which have 3 ancestors", +" <AAA>\n" +" <XXX>\n" +" <DDD>\n" +" <BBB/>\n" +" <BBB/>\n" +" <EEE/>\n" +" <FFF/>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD>\n" +" <BBB/>\n" +" <BBB/>\n" +" <EEE/>\n" +" <FFF/>\n" +" </DDD>\n" +" </CCC>\n" +" <CCC>\n" +" <BBB>\n" +" <BBB>\n" +" <BBB/>\n" +" </BBB>\n" +" </BBB>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//*", +"Select all elements", +" <AAA>\n" +" <XXX>\n" +" <DDD>\n" +" <BBB/>\n" +" <BBB/>\n" +" <EEE/>\n" +" <FFF/>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD>\n" +" <BBB/>\n" +" <BBB/>\n" +" <EEE/>\n" +" <FFF/>\n" +" </DDD>\n" +" </CCC>\n" +" <CCC>\n" +" <BBB>\n" +" <BBB>\n" +" <BBB/>\n" +" </BBB>\n" +" </BBB>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"/AAA/BBB[1]", +"Select the first BBB child of element AAA", +" <AAA>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" </AAA>\n" +}, + +{ +"/AAA/BBB[last()]", +"Select the last BBB child of element AAA", +" <AAA>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" </AAA>\n" +}, + +{ +"//@id", +"Select all attributes @id", +" <AAA>\n" +" <BBB id = 'b1'/>\n" +" <BBB id = 'b2'/>\n" +" <BBB name = 'bbb'/>\n" +" <BBB/>\n" +" </AAA>\n" +}, + +{ +"//BBB[@id]", +"Select BBB elements which have attribute id", +" <AAA>\n" +" <BBB id = 'b1'/>\n" +" <BBB id = 'b2'/>\n" +" <BBB name = 'bbb'/>\n" +" <BBB/>\n" +" </AAA>\n" +}, + +{ +"//BBB[@name]", +"Select BBB elements which have attribute name", +" <AAA>\n" +" <BBB id = 'b1'/>\n" +" <BBB id = 'b2'/>\n" +" <BBB name = 'bbb'/>\n" +" <BBB/>\n" +" </AAA>\n" +}, + +{ +"//BBB[@*]", +"Select BBB elements which have any attribute", +" <AAA>\n" +" <BBB id = 'b1'/>\n" +" <BBB id = 'b2'/>\n" +" <BBB name = 'bbb'/>\n" +" <BBB/>\n" +" </AAA>\n" +}, + +{ +"//BBB[not(@*)]", +"Select BBB elements without an attribute", +" <AAA>\n" +" <BBB id = 'b1'/>\n" +" <BBB id = 'b2'/>\n" +" <BBB name = 'bbb'/>\n" +" <BBB/>\n" +" </AAA>\n" +}, + +{ +"//BBB[@id='b1']", +"Select BBB elements which have attribute id with value b1", +" <AAA>\n" +" <BBB id = 'b1'/>\n" +" <BBB name = ' bbb '/>\n" +" <BBB name = 'bbb'/>\n" +" </AAA>\n" +}, + +{ +"//BBB[@name='bbb']", +"Select BBB elements which have attribute name with value 'bbb'", +" <AAA>\n" +" <BBB id = 'b1'/>\n" +" <BBB name = ' bbb '/>\n" +" <BBB name = 'bbb'/>\n" +" </AAA>\n" +}, + +{ +"//BBB[normalize-space(@name)='bbb']", +"Select BBB elements which have attribute name with value bbb, leading and trailing spaces are removed before comparison", +" <AAA>\n" +" <BBB id = 'b1'/>\n" +" <BBB name = ' bbb '/>\n" +" <BBB name = 'bbb'/>\n" +" </AAA>\n" +}, + +{ +"//*[count(BBB)=2]", +"Select elements which have two children BBB", +" <AAA>\n" +" <CCC>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" </CCC>\n" +" <DDD>\n" +" <BBB/>\n" +" <BBB/>\n" +" </DDD>\n" +" <EEE>\n" +" <CCC/>\n" +" <DDD/>\n" +" </EEE>\n" +" </AAA>\n" +}, + +{ +"//*[count(*)=2]", +"Select elements which have 2 children", +" <AAA>\n" +" <CCC>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" </CCC>\n" +" <DDD>\n" +" <BBB/>\n" +" <BBB/>\n" +" </DDD>\n" +" <EEE>\n" +" <CCC/>\n" +" <DDD/>\n" +" </EEE>\n" +" </AAA>\n" +}, + +{ +"//*[count(*)=3]", +"Select elements which have 3 children", +" <AAA>\n" +" <CCC>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" </CCC>\n" +" <DDD>\n" +" <BBB/>\n" +" <BBB/>\n" +" </DDD>\n" +" <EEE>\n" +" <CCC/>\n" +" <DDD/>\n" +" </EEE>\n" +" </AAA>\n" +}, + +{ +"//*[name()='BBB']", +"Select all elements with name BBB, equivalent with //BBB", +" <AAA>\n" +" <BCC>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" </BCC>\n" +" <DDB>\n" +" <BBB/>\n" +" <BBB/>\n" +" </DDB>\n" +" <BEC>\n" +" <CCC/>\n" +" <DBD/>\n" +" </BEC>\n" +" </AAA>\n" +}, + +{ +"//*[starts-with(name(),'B')]", +"Select all elements name of which starts with letter B", +" <AAA>\n" +" <BCC>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" </BCC>\n" +" <DDB>\n" +" <BBB/>\n" +" <BBB/>\n" +" </DDB>\n" +" <BEC>\n" +" <CCC/>\n" +" <DBD/>\n" +" </BEC>\n" +" </AAA>\n" +}, + +{ +"//*[contains(name(),'C')]", +"Select all elements name of which contain letter C", +" <AAA>\n" +" <BCC>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" </BCC>\n" +" <DDB>\n" +" <BBB/>\n" +" <BBB/>\n" +" </DDB>\n" +" <BEC>\n" +" <CCC/>\n" +" <DBD/>\n" +" </BEC>\n" +" </AAA>\n" +}, + +{ +"//*[string-length(name()) = 3]", +"Select elements with three-letter name", +" <AAA>\n" +" <Q/>\n" +" <SSSS/>\n" +" <BB/>\n" +" <CCC/>\n" +" <DDDDDDDD/>\n" +" <EEEE/>\n" +" </AAA>\n" +}, + +{ +"//*[string-length(name()) < 3]", +"Select elements name of which has one or two characters", +" <AAA>\n" +" <Q/>\n" +" <SSSS/>\n" +" <BB/>\n" +" <CCC/>\n" +" <DDDDDDDD/>\n" +" <EEEE/>\n" +" </AAA>\n" +}, + +{ +"//*[string-length(name()) > 3]", +"Select elements with name longer than three characters", +" <AAA>\n" +" <Q/>\n" +" <SSSS/>\n" +" <BB/>\n" +" <CCC/>\n" +" <DDDDDDDD/>\n" +" <EEEE/>\n" +" </AAA>\n" +}, + +{ +"//CCC | //BBB", +"Select all elements CCC and BBB", +" <AAA>\n" +" <BBB/>\n" +" <CCC/>\n" +" <DDD>\n" +" <CCC/>\n" +" </DDD>\n" +" <EEE/>\n" +" </AAA>\n" +}, + +{ +"/AAA/EEE | //BBB", +"Select all elements BBB and elements EEE which are children of root element AAA", +" <AAA>\n" +" <BBB/>\n" +" <CCC/>\n" +" <DDD>\n" +" <CCC/>\n" +" </DDD>\n" +" <EEE/>\n" +" </AAA>\n" +}, + +{ +"/AAA/EEE | //DDD/CCC | /AAA | //BBB", +"Number of combinations is not restricted", +" <AAA>\n" +" <BBB/>\n" +" <CCC/>\n" +" <DDD>\n" +" <CCC/>\n" +" </DDD>\n" +" <EEE/>\n" +" </AAA>\n" +}, + +{ +"/AAA", +"Equivalent of /child::AAA", +" <AAA>\n" +" <BBB/>\n" +" <CCC/>\n" +" </AAA>\n" +}, + +{ +"/child::AAA", +"Equivalent of /AAA", +" <AAA>\n" +" <BBB/>\n" +" <CCC/>\n" +" </AAA>\n" +}, + +{ +"/AAA/BBB", +"Equivalent of /child::AAA/child::BBB", +" <AAA>\n" +" <BBB/>\n" +" <CCC/>\n" +" </AAA>\n" +}, + +{ +"/child::AAA/child::BBB", +"Equivalent of /AAA/BBB", +" <AAA>\n" +" <BBB/>\n" +" <CCC/>\n" +" </AAA>\n" +}, + +{ +"/child::AAA/BBB", +"Both possibilities can be combined", +" <AAA>\n" +" <BBB/>\n" +" <CCC/>\n" +" </AAA>\n" +}, + +{ +"/descendant::*", +"Select all descendants of document root and therefore all elements", +" <AAA>\n" +" <BBB>\n" +" <DDD>\n" +" <CCC>\n" +" <DDD/>\n" +" <EEE/>\n" +" </CCC>\n" +" </DDD>\n" +" </BBB>\n" +" <CCC>\n" +" <DDD>\n" +" <EEE>\n" +" <DDD>\n" +" <FFF/>\n" +" </DDD>\n" +" </EEE>\n" +" </DDD>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"/AAA/BBB/descendant::*", +"Select all descendants of /AAA/BBB", +" <AAA>\n" +" <BBB>\n" +" <DDD>\n" +" <CCC>\n" +" <DDD/>\n" +" <EEE/>\n" +" </CCC>\n" +" </DDD>\n" +" </BBB>\n" +" <CCC>\n" +" <DDD>\n" +" <EEE>\n" +" <DDD>\n" +" <FFF/>\n" +" </DDD>\n" +" </EEE>\n" +" </DDD>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//CCC/descendant::*", +"Select all elements which have CCC among its ancestors", +" <AAA>\n" +" <BBB>\n" +" <DDD>\n" +" <CCC>\n" +" <DDD/>\n" +" <EEE/>\n" +" </CCC>\n" +" </DDD>\n" +" </BBB>\n" +" <CCC>\n" +" <DDD>\n" +" <EEE>\n" +" <DDD>\n" +" <FFF/>\n" +" </DDD>\n" +" </EEE>\n" +" </DDD>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//CCC/descendant::DDD", +"Select elements DDD which have CCC among its ancestors", +" <AAA>\n" +" <BBB>\n" +" <DDD>\n" +" <CCC>\n" +" <DDD/>\n" +" <EEE/>\n" +" </CCC>\n" +" </DDD>\n" +" </BBB>\n" +" <CCC>\n" +" <DDD>\n" +" <EEE>\n" +" <DDD>\n" +" <FFF/>\n" +" </DDD>\n" +" </EEE>\n" +" </DDD>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//DDD/parent::*", +"Select all parents of DDD element", +" <AAA>\n" +" <BBB>\n" +" <DDD>\n" +" <CCC>\n" +" <DDD/>\n" +" <EEE/>\n" +" </CCC>\n" +" </DDD>\n" +" </BBB>\n" +" <CCC>\n" +" <DDD>\n" +" <EEE>\n" +" <DDD>\n" +" <FFF/>\n" +" </DDD>\n" +" </EEE>\n" +" </DDD>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"/AAA/BBB/DDD/CCC/EEE/ancestor::*", +"Select all elements given in this absolute path", +" <AAA>\n" +" <BBB>\n" +" <DDD>\n" +" <CCC>\n" +" <DDD/>\n" +" <EEE/>\n" +" </CCC>\n" +" </DDD>\n" +" </BBB>\n" +" <CCC>\n" +" <DDD>\n" +" <EEE>\n" +" <DDD>\n" +" <FFF/>\n" +" </DDD>\n" +" </EEE>\n" +" </DDD>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//FFF/ancestor::*", +"Select ancestors of FFF element", +" <AAA>\n" +" <BBB>\n" +" <DDD>\n" +" <CCC>\n" +" <DDD/>\n" +" <EEE/>\n" +" </CCC>\n" +" </DDD>\n" +" </BBB>\n" +" <CCC>\n" +" <DDD>\n" +" <EEE>\n" +" <DDD>\n" +" <FFF/>\n" +" </DDD>\n" +" </EEE>\n" +" </DDD>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"/AAA/BBB/following-sibling::*", +"The following-sibling axis contains all the following siblings of the context node.", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <DDD/>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <DDD/>\n" +" <CCC/>\n" +" <FFF/>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//CCC/following-sibling::*", +"The following-sibling axis contains all the following siblings of the context node.", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <DDD/>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <DDD/>\n" +" <CCC/>\n" +" <FFF/>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"/AAA/XXX/preceding-sibling::*", +"The preceding-sibling axis contains all the preceding siblings of the context node.", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <DDD/>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <DDD/>\n" +" <CCC/>\n" +" <FFF/>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//CCC/preceding-sibling::*", +"The preceding-sibling axis contains all the preceding siblings of the context node", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <DDD/>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <DDD/>\n" +" <CCC/>\n" +" <FFF/>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"/AAA/XXX/following::*", +"The following axis contains all nodes in the same document as the context " +"node that are after the context node in document order, " +"excluding any descendants and excluding attribute nodes and namespace nodes.", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ>\n" +" <DDD/>\n" +" <DDD>\n" +" <EEE/>\n" +" </DDD>\n" +" </ZZZ>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <DDD/>\n" +" <CCC/>\n" +" <FFF/>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//ZZZ/following::*", +"The following axis contains all nodes in the same document as the context " +"node that are after the context node in document order, " +"excluding any descendants and excluding attribute nodes and namespace nodes.", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ>\n" +" <DDD/>\n" +" <DDD>\n" +" <EEE/>\n" +" </DDD>\n" +" </ZZZ>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <DDD/>\n" +" <CCC/>\n" +" <FFF/>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"/AAA/XXX/preceding::*", +"The preceding axis contains all nodes in the same document as the " +"context node that are before the context node in document order, " +"excluding any ancestors and excluding attribute nodes and namespace nodes", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ>\n" +" <DDD/>\n" +" </ZZZ>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <DDD/>\n" +" <CCC/>\n" +" <FFF/>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//GGG/preceding::*", +"The preceding axis contains all nodes in the same document as the " +"context node that are before the context node in document order, " +"excluding any ancestors and excluding attribute nodes and namespace nodes", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ>\n" +" <DDD/>\n" +" </ZZZ>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <DDD/>\n" +" <CCC/>\n" +" <FFF/>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"/AAA/XXX/descendant-or-self::*", +"The descendant-or-self axis contains the " +"context node and the descendants of the context node", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ>\n" +" <DDD/>\n" +" </ZZZ>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <DDD/>\n" +" <CCC/>\n" +" <FFF/>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//CCC/descendant-or-self::*", +"The descendant-or-self axis contains the " +"context node and the descendants of the context node", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ>\n" +" <DDD/>\n" +" </ZZZ>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <DDD/>\n" +" <CCC/>\n" +" <FFF/>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"/AAA/XXX/DDD/EEE/ancestor-or-self::*", +"The ancestor-or-self axis contains the context node and the " +"ancestors of the context node; thus, the ancestor-or-self axis " +"will always include the root node.", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ>\n" +" <DDD/>\n" +" </ZZZ>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <DDD/>\n" +" <CCC/>\n" +" <FFF/>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//GGG/ancestor-or-self::*", +"The ancestor-or-self axis contains the context node and the " +"ancestors of the context node; thus, the ancestor-or-self axis " +"will always include the root node.", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ>\n" +" <DDD/>\n" +" </ZZZ>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <DDD/>\n" +" <CCC/>\n" +" <FFF/>\n" +" <FFF>\n" +" <GGG/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//GGG/ancestor::*", +"The ancestor, descendant, following, preceding and self axes partition a document", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ/>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <FFF>\n" +" <HHH/>\n" +" <GGG>\n" +" <JJJ>\n" +" <QQQ/>\n" +" </JJJ>\n" +" <JJJ/>\n" +" </GGG>\n" +" <HHH/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//GGG/descendant::*", +"The ancestor, descendant, following, preceding and self axes partition a document", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ/>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <FFF>\n" +" <HHH/>\n" +" <GGG>\n" +" <JJJ>\n" +" <QQQ/>\n" +" </JJJ>\n" +" <JJJ/>\n" +" </GGG>\n" +" <HHH/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//GGG/following::*", +"The ancestor, descendant, following, preceding and self axes partition a document", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ/>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <FFF>\n" +" <HHH/>\n" +" <GGG>\n" +" <JJJ>\n" +" <QQQ/>\n" +" </JJJ>\n" +" <JJJ/>\n" +" </GGG>\n" +" <HHH/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//GGG/preceding::*", +"The ancestor, descendant, following, preceding and self axes partition a document", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ/>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <FFF>\n" +" <HHH/>\n" +" <GGG>\n" +" <JJJ>\n" +" <QQQ/>\n" +" </JJJ>\n" +" <JJJ/>\n" +" </GGG>\n" +" <HHH/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//GGG/self::*", +"The ancestor, descendant, following, preceding and self axes partition a document", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ/>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <FFF>\n" +" <HHH/>\n" +" <GGG>\n" +" <JJJ>\n" +" <QQQ/>\n" +" </JJJ>\n" +" <JJJ/>\n" +" </GGG>\n" +" <HHH/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//GGG/ancestor::* | //GGG/descendant::* | //GGG/following::* | //GGG/preceding::* | //GGG/self::*", +"The ancestor, descendant, following, preceding and self axes partition a document", +" <AAA>\n" +" <BBB>\n" +" <CCC/>\n" +" <ZZZ/>\n" +" </BBB>\n" +" <XXX>\n" +" <DDD>\n" +" <EEE/>\n" +" <FFF>\n" +" <HHH/>\n" +" <GGG>\n" +" <JJJ>\n" +" <QQQ/>\n" +" </JJJ>\n" +" <JJJ/>\n" +" </GGG>\n" +" <HHH/>\n" +" </FFF>\n" +" </DDD>\n" +" </XXX>\n" +" <CCC>\n" +" <DDD/>\n" +" </CCC>\n" +" </AAA>\n" +}, + +{ +"//BBB[position() mod 2 = 0 ]", +"Select even BBB elements", +" <AAA>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <CCC/>\n" +" <CCC/>\n" +" <CCC/>\n" +" </AAA>\n" +}, + +{ +"//BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]", +"Select middle BBB element(s)", +" <AAA>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <CCC/>\n" +" <CCC/>\n" +" <CCC/>\n" +" </AAA>\n" +}, + +{ +"//CCC[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]", +"Select middle CCC element(s)", +" <AAA>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <BBB/>\n" +" <CCC/>\n" +" <CCC/>\n" +" <CCC/>\n" +" </AAA>\n" +}, + +{ //end data +NULL, +NULL, +NULL, +} + +}; + + + +bool doStringTest(char *str) +{ + XPathParser xp; + xp.setDebug(true); + + if (!xp.parse(str)) + return false; + + + return true; +} + + + +bool doStringTests() +{ + for (XpathTest *xpt = xpathTests ; xpt->xpathStr ; xpt++) + { + if (!doStringTest(xpt->xpathStr)) + return false; + } + return true; +} + +void dumpDoc(Document *doc) +{ + ls::DOMImplementationLSImpl domImpl; + ls::LSSerializer &serializer = domImpl.createLSSerializer(); + ls::LSOutput output = domImpl.createLSOutput(); + io::StdWriter writer; + output.setCharacterStream(&writer); + serializer.write(doc, output); +} + + +bool doXmlTest(XpathTest *xpt) +{ + //### READ + ls::DOMImplementationLSImpl domImpl; + ls::LSInput input = domImpl.createLSInput(); + ls::LSParser &parser = domImpl.createLSParser(0, ""); + input.setStringData(xpt->xml); + Document *doc = parser.parse(input); + + //### XPATH + XPathParser xp; + xp.setDebug(true); + + org::w3c::dom::NodeList list = xp.evaluate(doc, xpt->xpathStr); + for (unsigned int i=0 ; i<list.getLength() ; i++) + { + org::w3c::dom::Node *n = list.item(i); + } + + //dumpDoc(doc); + + delete doc; + return true; +} + +bool doXmlTests() +{ + for (XpathTest *xpt = xpathTests ; xpt->xpathStr ; xpt++) + { + if (!doXmlTest(xpt)) + return false; + } + return true; +} + +bool doTests() +{ + /* + if (!doStringTests()) + { + printf("## Failed string tests\n"); + return false; + } + */ + if (!doXmlTests()) + { + printf("## Failed xml tests\n"); + return false; + } + return true; +} + + + +int main(int argc, char **argv) +{ + doTests(); + return 0; +} |
