Nikolay Sivov : msxml3: Support 'any attribute' selection [@*] in XSLPattern predicates.

Alexandre Julliard julliard at winehq.org
Tue May 13 14:23:46 CDT 2014


Module: wine
Branch: master
Commit: 239d8077db6e9ebf9f2b3eda31e1733e30d40143
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=239d8077db6e9ebf9f2b3eda31e1733e30d40143

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue May 13 00:20:21 2014 +0400

msxml3: Support 'any attribute' selection [@*] in XSLPattern predicates.

---

 dlls/msxml3/tests/domdoc.c |   27 ++++++++++++++++++++-------
 dlls/msxml3/xslpattern.y   |    5 +++++
 2 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 19b2951..b028996 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -494,7 +494,7 @@ static const char szExampleXML[] =
 "        </description>\n"
 "    </elem>\n"
 "\n"
-"    <elem>\n"
+"    <elem a='a'>\n"
 "        <a>A2 field</a>\n"
 "        <b>B2 field</b>\n"
 "        <c type=\"old\">C2 field</c>\n"
@@ -1074,14 +1074,16 @@ static char *list_to_string(IXMLDOMNodeList *list)
     static char buf[4096];
     char *pos = buf;
     LONG len = 0;
+    HRESULT hr;
     int i;
 
     if (list == NULL)
     {
-        lstrcpyA(buf, "(null)");
+        strcpy(buf, "(null)");
         return buf;
     }
-    ole_check(IXMLDOMNodeList_get_length(list, &len));
+    hr = IXMLDOMNodeList_get_length(list, &len);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
     for (i = 0; i < len; i++)
     {
         IXMLDOMNode *node;
@@ -4449,12 +4451,13 @@ static const xpath_test_t xpath_test[] = {
     { "child::node()", "E1.E2.D1 E2.E2.D1 E3.E2.D1 E4.E2.D1" },
     { "child::text()", "" },
     { "child::*/..", "E2.D1" },
-    { "child::*//@*/..", "E2.E5.E1.E2.D1 E3.E2.E2.D1" },
+    { "child::*//@*/..", "E2.E5.E1.E2.D1 E2.E2.D1 E3.E2.E2.D1" },
     { "self::node()", "E2.D1" },
     { "ancestor::node()", "D1" },
     { "elem[c][last()]/a", "E1.E2.E2.D1"},
     { "ancestor-or-self::node()[1]", "E2.D1" },
     { "((//a)[1])[last()]", "E1.E1.E2.D1" },
+    { "//elem[@*]", "E2.E2.D1" },
     { NULL }
 };
 
@@ -4517,7 +4520,7 @@ static void test_XPath(void)
 
         str = list_to_string(list);
 
-        ok(strcmp(str, xptest->list)==0, "query=%s, invalid node list: %s, expected %s\n",
+        ok(!strcmp(str, xptest->list), "query=%s, invalid node list: \"%s\", expected \"%s\"\n",
             xptest->query, str, xptest->list);
 
         if (list)
@@ -6838,6 +6841,7 @@ static void test_default_properties(void)
 typedef struct {
     const char *query;
     const char *list;
+    BOOL todo;
 } xslpattern_test_t;
 
 static const xslpattern_test_t xslpattern_test[] = {
@@ -6900,6 +6904,7 @@ static const xslpattern_test_t xslpattern_test[] = {
     { "root/elem[index()>0 $and$ $not$ end()]", "E2.E2.D1 E3.E2.D1" },
     { "root/elem[index()>0 && $not$ end()]", "E2.E2.D1 E3.E2.D1" },
     { "root/elem[d]", "E1.E2.D1 E2.E2.D1 E4.E2.D1" },
+    { "root/elem[@*]", "E2.E2.D1 E3.E2.D1", TRUE },
     { NULL }
 };
 
@@ -6977,8 +6982,16 @@ static void test_XSLPattern(void)
         len = 0;
         hr = IXMLDOMNodeList_get_length(list, &len);
         ok(len != 0, "query=%s, empty list\n", ptr->query);
-        if (len)
-            expect_list_and_release(list, ptr->list);
+        if (len) {
+            if (ptr->todo) {
+                char *str = list_to_string(list);
+            todo_wine
+                ok(!strcmp(str, ptr->list), "Invalid node list: %s, expected %s\n", str, ptr->list);
+                IXMLDOMNodeList_Release(list);
+            }
+            else
+                expect_list_and_release(list, ptr->list);
+        }
 
         ptr++;
     }
diff --git a/dlls/msxml3/xslpattern.y b/dlls/msxml3/xslpattern.y
index 4e3b699..9adb318 100644
--- a/dlls/msxml3/xslpattern.y
+++ b/dlls/msxml3/xslpattern.y
@@ -186,6 +186,11 @@ static void xslpattern_error(parser_param* param, void const* scanner, char cons
                                 $$=xmlStrcat($$,$2);
                                 xmlFree($2);
                             }
+                            | '@' '*'
+                            {
+                                TRACE("Got All attributes pattern: \"@*\"\n");
+                                $$=xmlStrdup(U("@*"));
+                            }
     ;
 
     /* [2.3] Node Tests */




More information about the wine-cvs mailing list