Loading mysql-test/r/xml.result +75 −0 Original line number Diff line number Diff line Loading @@ -809,3 +809,78 @@ ExtractValue(@xml, "/entry[(50<pt)]/id") select ExtractValue(@xml, "/entry[(50<=pt)]/id"); ExtractValue(@xml, "/entry[(50<=pt)]/id") pt50 select ExtractValue('<a><b><Text>test</Text></b></a>','/a/b/Text'); ExtractValue('<a><b><Text>test</Text></b></a>','/a/b/Text') test select ExtractValue('<a><b><comment>test</comment></b></a>','/a/b/comment'); ExtractValue('<a><b><comment>test</comment></b></a>','/a/b/comment') test select ExtractValue('<a><b><node>test</node></b></a>','/a/b/node'); ExtractValue('<a><b><node>test</node></b></a>','/a/b/node') test select ExtractValue('<a><b><processing-instruction>test</processing-instruction></b></a>','/a/b/processing-instruction'); ExtractValue('<a><b><processing-instruction>test</processing-instruction></b></a>','/a/b/processing-instruction') test select ExtractValue('<a><and>test</and></a>', '/a/and'); ExtractValue('<a><and>test</and></a>', '/a/and') test select ExtractValue('<a><or>test</or></a>', '/a/or'); ExtractValue('<a><or>test</or></a>', '/a/or') test select ExtractValue('<a><mod>test</mod></a>', '/a/mod'); ExtractValue('<a><mod>test</mod></a>', '/a/mod') test select ExtractValue('<a><div>test</div></a>', '/a/div'); ExtractValue('<a><div>test</div></a>', '/a/div') test select ExtractValue('<a><and:and>test</and:and></a>', '/a/and:and'); ExtractValue('<a><and:and>test</and:and></a>', '/a/and:and') test select ExtractValue('<a><or:or>test</or:or></a>', '/a/or:or'); ExtractValue('<a><or:or>test</or:or></a>', '/a/or:or') test select ExtractValue('<a><mod:mod>test</mod:mod></a>', '/a/mod:mod'); ExtractValue('<a><mod:mod>test</mod:mod></a>', '/a/mod:mod') test select ExtractValue('<a><div:div>test</div:div></a>', '/a/div:div'); ExtractValue('<a><div:div>test</div:div></a>', '/a/div:div') test select ExtractValue('<a><ancestor>test</ancestor></a>', '/a/ancestor'); ExtractValue('<a><ancestor>test</ancestor></a>', '/a/ancestor') test select ExtractValue('<a><ancestor-or-self>test</ancestor-or-self></a>', '/a/ancestor-or-self'); ExtractValue('<a><ancestor-or-self>test</ancestor-or-self></a>', '/a/ancestor-or-self') test select ExtractValue('<a><attribute>test</attribute></a>', '/a/attribute'); ExtractValue('<a><attribute>test</attribute></a>', '/a/attribute') test select ExtractValue('<a><child>test</child></a>', '/a/child'); ExtractValue('<a><child>test</child></a>', '/a/child') test select ExtractValue('<a><descendant>test</descendant></a>', '/a/descendant'); ExtractValue('<a><descendant>test</descendant></a>', '/a/descendant') test select ExtractValue('<a><descendant-or-self>test</descendant-or-self></a>', '/a/descendant-or-self'); ExtractValue('<a><descendant-or-self>test</descendant-or-self></a>', '/a/descendant-or-self') test select ExtractValue('<a><following>test</following></a>', '/a/following'); ExtractValue('<a><following>test</following></a>', '/a/following') test select ExtractValue('<a><following-sibling>test</following-sibling></a>', '/a/following-sibling'); ExtractValue('<a><following-sibling>test</following-sibling></a>', '/a/following-sibling') test select ExtractValue('<a><namespace>test</namespace></a>', '/a/namespace'); ExtractValue('<a><namespace>test</namespace></a>', '/a/namespace') test select ExtractValue('<a><parent>test</parent></a>', '/a/parent'); ExtractValue('<a><parent>test</parent></a>', '/a/parent') test select ExtractValue('<a><preceding>test</preceding></a>', '/a/preceding'); ExtractValue('<a><preceding>test</preceding></a>', '/a/preceding') test select ExtractValue('<a><preceding-sibling>test</preceding-sibling></a>', '/a/preceding-sibling'); ExtractValue('<a><preceding-sibling>test</preceding-sibling></a>', '/a/preceding-sibling') test select ExtractValue('<a><self>test</self></a>', '/a/self'); ExtractValue('<a><self>test</self></a>', '/a/self') test mysql-test/t/xml.test +38 −0 Original line number Diff line number Diff line Loading @@ -406,3 +406,41 @@ select ExtractValue(@xml, "/entry[(50>pt)]/id"); select ExtractValue(@xml, "/entry[(50>=pt)]/id"); select ExtractValue(@xml, "/entry[(50<pt)]/id"); select ExtractValue(@xml, "/entry[(50<=pt)]/id"); # # Bug#24747 XPath error with the node name "Text" # # # Test nodetypes in node name context # select ExtractValue('<a><b><Text>test</Text></b></a>','/a/b/Text'); select ExtractValue('<a><b><comment>test</comment></b></a>','/a/b/comment'); select ExtractValue('<a><b><node>test</node></b></a>','/a/b/node'); select ExtractValue('<a><b><processing-instruction>test</processing-instruction></b></a>','/a/b/processing-instruction'); # # Test keywords in node name contexts # select ExtractValue('<a><and>test</and></a>', '/a/and'); select ExtractValue('<a><or>test</or></a>', '/a/or'); select ExtractValue('<a><mod>test</mod></a>', '/a/mod'); select ExtractValue('<a><div>test</div></a>', '/a/div'); select ExtractValue('<a><and:and>test</and:and></a>', '/a/and:and'); select ExtractValue('<a><or:or>test</or:or></a>', '/a/or:or'); select ExtractValue('<a><mod:mod>test</mod:mod></a>', '/a/mod:mod'); select ExtractValue('<a><div:div>test</div:div></a>', '/a/div:div'); # # Test axis names in node name context # select ExtractValue('<a><ancestor>test</ancestor></a>', '/a/ancestor'); select ExtractValue('<a><ancestor-or-self>test</ancestor-or-self></a>', '/a/ancestor-or-self'); select ExtractValue('<a><attribute>test</attribute></a>', '/a/attribute'); select ExtractValue('<a><child>test</child></a>', '/a/child'); select ExtractValue('<a><descendant>test</descendant></a>', '/a/descendant'); select ExtractValue('<a><descendant-or-self>test</descendant-or-self></a>', '/a/descendant-or-self'); select ExtractValue('<a><following>test</following></a>', '/a/following'); select ExtractValue('<a><following-sibling>test</following-sibling></a>', '/a/following-sibling'); select ExtractValue('<a><namespace>test</namespace></a>', '/a/namespace'); select ExtractValue('<a><parent>test</parent></a>', '/a/parent'); select ExtractValue('<a><preceding>test</preceding></a>', '/a/preceding'); select ExtractValue('<a><preceding-sibling>test</preceding-sibling></a>', '/a/preceding-sibling'); select ExtractValue('<a><self>test</self></a>', '/a/self'); sql/item_xmlfunc.cc +76 −16 Original line number Diff line number Diff line Loading @@ -1045,12 +1045,12 @@ static struct my_xpath_keyword_names_st my_keyword_names[] = {MY_XPATH_LEX_OR , "or" , 2, 0 }, {MY_XPATH_LEX_DIV , "div" , 3, 0 }, {MY_XPATH_LEX_MOD , "mod" , 3, 0 }, {0,NULL,0,0} }; {MY_XPATH_LEX_NODETYPE, "comment" , 7, 0 }, {MY_XPATH_LEX_NODETYPE, "text" , 4, 0 }, {MY_XPATH_LEX_NODETYPE, "processing-instruction" , 22,0 }, {MY_XPATH_LEX_NODETYPE, "node" , 4, 0 }, static struct my_xpath_keyword_names_st my_axis_names[]= { {MY_XPATH_LEX_AXIS,"ancestor" , 8,MY_XPATH_AXIS_ANCESTOR }, {MY_XPATH_LEX_AXIS,"ancestor-or-self" ,16,MY_XPATH_AXIS_ANCESTOR_OR_SELF }, {MY_XPATH_LEX_AXIS,"attribute" , 9,MY_XPATH_AXIS_ATTRIBUTE }, Loading @@ -1064,7 +1064,16 @@ static struct my_xpath_keyword_names_st my_keyword_names[] = {MY_XPATH_LEX_AXIS,"preceding" , 9,MY_XPATH_AXIS_PRECEDING }, {MY_XPATH_LEX_AXIS,"preceding-sibling" ,17,MY_XPATH_AXIS_PRECEDING_SIBLING }, {MY_XPATH_LEX_AXIS,"self" , 4,MY_XPATH_AXIS_SELF }, {0,NULL,0,0} }; static struct my_xpath_keyword_names_st my_nodetype_names[]= { {MY_XPATH_LEX_NODETYPE, "comment" , 7, 0 }, {MY_XPATH_LEX_NODETYPE, "text" , 4, 0 }, {MY_XPATH_LEX_NODETYPE, "processing-instruction" , 22,0 }, {MY_XPATH_LEX_NODETYPE, "node" , 4, 0 }, {0,NULL,0,0} }; Loading @@ -1079,11 +1088,14 @@ static struct my_xpath_keyword_names_st my_keyword_names[] = - Token type, on lookup success. - MY_XPATH_LEX_IDENT, on lookup failure. */ static int my_xpath_keyword(MY_XPATH *x, const char *beg, const char *end) static int my_xpath_keyword(MY_XPATH *x, struct my_xpath_keyword_names_st *keyword_names, const char *beg, const char *end) { struct my_xpath_keyword_names_st *k; size_t length= end-beg; for (k= my_keyword_names; k->name; k++) for (k= keyword_names; k->name; k++) { if (length == k->length && !strncasecmp(beg, k->name, length)) { Loading Loading @@ -1369,15 +1381,32 @@ my_xpath_lex_scan(MY_XPATH *xpath, beg+= length) /* no op */; lex->end= beg; // check if a function call if (*beg == '(' && (xpath->func= my_xpath_function(lex->beg, beg))) if (beg < end) { if (*beg == '(') { /* check if a function call, e.g.: count(/a/b) or a nodetype test, e.g.: /a/b/text() */ if ((xpath->func= my_xpath_function(lex->beg, beg))) lex->term= MY_XPATH_LEX_FUNC; else lex->term= my_xpath_keyword(xpath, my_nodetype_names, lex->beg, beg); return; } // check if an axis specifier, e.g.: /a/b/child::* else if (*beg == ':' && beg + 1 < end && beg[1] == ':') { lex->term= my_xpath_keyword(xpath, my_axis_names, lex->beg, beg); return; } } // check if a keyword lex->term= my_xpath_keyword(xpath, lex->beg, beg); lex->term= my_xpath_keyword(xpath, my_keyword_names, lex->beg, beg); return; } Loading Loading @@ -2331,6 +2360,36 @@ static int my_xpath_parse_Number(MY_XPATH *xpath) } /* Scan NCName. SYNOPSYS The keywords AND, OR, MOD, DIV are valid identitiers when they are in identifier context: SELECT ExtractValue('<and><or><mod><div>VALUE</div></mod></or></and>', '/and/or/mod/div') -> VALUE RETURN 1 - success 0 - failure */ static int my_xpath_parse_NCName(MY_XPATH *xpath) { return my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT) || my_xpath_parse_term(xpath, MY_XPATH_LEX_AND) || my_xpath_parse_term(xpath, MY_XPATH_LEX_OR) || my_xpath_parse_term(xpath, MY_XPATH_LEX_MOD) || my_xpath_parse_term(xpath, MY_XPATH_LEX_DIV) ? 1 : 0; } /* QName grammar can be found in a separate document http://www.w3.org/TR/REC-xml-names/#NT-QName Loading @@ -2339,16 +2398,17 @@ static int my_xpath_parse_Number(MY_XPATH *xpath) [7] Prefix ::= NCName [8] LocalPart ::= NCName */ static int my_xpath_parse_QName(MY_XPATH *xpath) { const char *beg; if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT)) if (!my_xpath_parse_NCName(xpath)) return 0; beg= xpath->prevtok.beg; if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_COLON)) return 1; /* Non qualified name */ if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT)) if (!my_xpath_parse_NCName(xpath)) return 0; xpath->prevtok.beg= beg; return 1; Loading Loading
mysql-test/r/xml.result +75 −0 Original line number Diff line number Diff line Loading @@ -809,3 +809,78 @@ ExtractValue(@xml, "/entry[(50<pt)]/id") select ExtractValue(@xml, "/entry[(50<=pt)]/id"); ExtractValue(@xml, "/entry[(50<=pt)]/id") pt50 select ExtractValue('<a><b><Text>test</Text></b></a>','/a/b/Text'); ExtractValue('<a><b><Text>test</Text></b></a>','/a/b/Text') test select ExtractValue('<a><b><comment>test</comment></b></a>','/a/b/comment'); ExtractValue('<a><b><comment>test</comment></b></a>','/a/b/comment') test select ExtractValue('<a><b><node>test</node></b></a>','/a/b/node'); ExtractValue('<a><b><node>test</node></b></a>','/a/b/node') test select ExtractValue('<a><b><processing-instruction>test</processing-instruction></b></a>','/a/b/processing-instruction'); ExtractValue('<a><b><processing-instruction>test</processing-instruction></b></a>','/a/b/processing-instruction') test select ExtractValue('<a><and>test</and></a>', '/a/and'); ExtractValue('<a><and>test</and></a>', '/a/and') test select ExtractValue('<a><or>test</or></a>', '/a/or'); ExtractValue('<a><or>test</or></a>', '/a/or') test select ExtractValue('<a><mod>test</mod></a>', '/a/mod'); ExtractValue('<a><mod>test</mod></a>', '/a/mod') test select ExtractValue('<a><div>test</div></a>', '/a/div'); ExtractValue('<a><div>test</div></a>', '/a/div') test select ExtractValue('<a><and:and>test</and:and></a>', '/a/and:and'); ExtractValue('<a><and:and>test</and:and></a>', '/a/and:and') test select ExtractValue('<a><or:or>test</or:or></a>', '/a/or:or'); ExtractValue('<a><or:or>test</or:or></a>', '/a/or:or') test select ExtractValue('<a><mod:mod>test</mod:mod></a>', '/a/mod:mod'); ExtractValue('<a><mod:mod>test</mod:mod></a>', '/a/mod:mod') test select ExtractValue('<a><div:div>test</div:div></a>', '/a/div:div'); ExtractValue('<a><div:div>test</div:div></a>', '/a/div:div') test select ExtractValue('<a><ancestor>test</ancestor></a>', '/a/ancestor'); ExtractValue('<a><ancestor>test</ancestor></a>', '/a/ancestor') test select ExtractValue('<a><ancestor-or-self>test</ancestor-or-self></a>', '/a/ancestor-or-self'); ExtractValue('<a><ancestor-or-self>test</ancestor-or-self></a>', '/a/ancestor-or-self') test select ExtractValue('<a><attribute>test</attribute></a>', '/a/attribute'); ExtractValue('<a><attribute>test</attribute></a>', '/a/attribute') test select ExtractValue('<a><child>test</child></a>', '/a/child'); ExtractValue('<a><child>test</child></a>', '/a/child') test select ExtractValue('<a><descendant>test</descendant></a>', '/a/descendant'); ExtractValue('<a><descendant>test</descendant></a>', '/a/descendant') test select ExtractValue('<a><descendant-or-self>test</descendant-or-self></a>', '/a/descendant-or-self'); ExtractValue('<a><descendant-or-self>test</descendant-or-self></a>', '/a/descendant-or-self') test select ExtractValue('<a><following>test</following></a>', '/a/following'); ExtractValue('<a><following>test</following></a>', '/a/following') test select ExtractValue('<a><following-sibling>test</following-sibling></a>', '/a/following-sibling'); ExtractValue('<a><following-sibling>test</following-sibling></a>', '/a/following-sibling') test select ExtractValue('<a><namespace>test</namespace></a>', '/a/namespace'); ExtractValue('<a><namespace>test</namespace></a>', '/a/namespace') test select ExtractValue('<a><parent>test</parent></a>', '/a/parent'); ExtractValue('<a><parent>test</parent></a>', '/a/parent') test select ExtractValue('<a><preceding>test</preceding></a>', '/a/preceding'); ExtractValue('<a><preceding>test</preceding></a>', '/a/preceding') test select ExtractValue('<a><preceding-sibling>test</preceding-sibling></a>', '/a/preceding-sibling'); ExtractValue('<a><preceding-sibling>test</preceding-sibling></a>', '/a/preceding-sibling') test select ExtractValue('<a><self>test</self></a>', '/a/self'); ExtractValue('<a><self>test</self></a>', '/a/self') test
mysql-test/t/xml.test +38 −0 Original line number Diff line number Diff line Loading @@ -406,3 +406,41 @@ select ExtractValue(@xml, "/entry[(50>pt)]/id"); select ExtractValue(@xml, "/entry[(50>=pt)]/id"); select ExtractValue(@xml, "/entry[(50<pt)]/id"); select ExtractValue(@xml, "/entry[(50<=pt)]/id"); # # Bug#24747 XPath error with the node name "Text" # # # Test nodetypes in node name context # select ExtractValue('<a><b><Text>test</Text></b></a>','/a/b/Text'); select ExtractValue('<a><b><comment>test</comment></b></a>','/a/b/comment'); select ExtractValue('<a><b><node>test</node></b></a>','/a/b/node'); select ExtractValue('<a><b><processing-instruction>test</processing-instruction></b></a>','/a/b/processing-instruction'); # # Test keywords in node name contexts # select ExtractValue('<a><and>test</and></a>', '/a/and'); select ExtractValue('<a><or>test</or></a>', '/a/or'); select ExtractValue('<a><mod>test</mod></a>', '/a/mod'); select ExtractValue('<a><div>test</div></a>', '/a/div'); select ExtractValue('<a><and:and>test</and:and></a>', '/a/and:and'); select ExtractValue('<a><or:or>test</or:or></a>', '/a/or:or'); select ExtractValue('<a><mod:mod>test</mod:mod></a>', '/a/mod:mod'); select ExtractValue('<a><div:div>test</div:div></a>', '/a/div:div'); # # Test axis names in node name context # select ExtractValue('<a><ancestor>test</ancestor></a>', '/a/ancestor'); select ExtractValue('<a><ancestor-or-self>test</ancestor-or-self></a>', '/a/ancestor-or-self'); select ExtractValue('<a><attribute>test</attribute></a>', '/a/attribute'); select ExtractValue('<a><child>test</child></a>', '/a/child'); select ExtractValue('<a><descendant>test</descendant></a>', '/a/descendant'); select ExtractValue('<a><descendant-or-self>test</descendant-or-self></a>', '/a/descendant-or-self'); select ExtractValue('<a><following>test</following></a>', '/a/following'); select ExtractValue('<a><following-sibling>test</following-sibling></a>', '/a/following-sibling'); select ExtractValue('<a><namespace>test</namespace></a>', '/a/namespace'); select ExtractValue('<a><parent>test</parent></a>', '/a/parent'); select ExtractValue('<a><preceding>test</preceding></a>', '/a/preceding'); select ExtractValue('<a><preceding-sibling>test</preceding-sibling></a>', '/a/preceding-sibling'); select ExtractValue('<a><self>test</self></a>', '/a/self');
sql/item_xmlfunc.cc +76 −16 Original line number Diff line number Diff line Loading @@ -1045,12 +1045,12 @@ static struct my_xpath_keyword_names_st my_keyword_names[] = {MY_XPATH_LEX_OR , "or" , 2, 0 }, {MY_XPATH_LEX_DIV , "div" , 3, 0 }, {MY_XPATH_LEX_MOD , "mod" , 3, 0 }, {0,NULL,0,0} }; {MY_XPATH_LEX_NODETYPE, "comment" , 7, 0 }, {MY_XPATH_LEX_NODETYPE, "text" , 4, 0 }, {MY_XPATH_LEX_NODETYPE, "processing-instruction" , 22,0 }, {MY_XPATH_LEX_NODETYPE, "node" , 4, 0 }, static struct my_xpath_keyword_names_st my_axis_names[]= { {MY_XPATH_LEX_AXIS,"ancestor" , 8,MY_XPATH_AXIS_ANCESTOR }, {MY_XPATH_LEX_AXIS,"ancestor-or-self" ,16,MY_XPATH_AXIS_ANCESTOR_OR_SELF }, {MY_XPATH_LEX_AXIS,"attribute" , 9,MY_XPATH_AXIS_ATTRIBUTE }, Loading @@ -1064,7 +1064,16 @@ static struct my_xpath_keyword_names_st my_keyword_names[] = {MY_XPATH_LEX_AXIS,"preceding" , 9,MY_XPATH_AXIS_PRECEDING }, {MY_XPATH_LEX_AXIS,"preceding-sibling" ,17,MY_XPATH_AXIS_PRECEDING_SIBLING }, {MY_XPATH_LEX_AXIS,"self" , 4,MY_XPATH_AXIS_SELF }, {0,NULL,0,0} }; static struct my_xpath_keyword_names_st my_nodetype_names[]= { {MY_XPATH_LEX_NODETYPE, "comment" , 7, 0 }, {MY_XPATH_LEX_NODETYPE, "text" , 4, 0 }, {MY_XPATH_LEX_NODETYPE, "processing-instruction" , 22,0 }, {MY_XPATH_LEX_NODETYPE, "node" , 4, 0 }, {0,NULL,0,0} }; Loading @@ -1079,11 +1088,14 @@ static struct my_xpath_keyword_names_st my_keyword_names[] = - Token type, on lookup success. - MY_XPATH_LEX_IDENT, on lookup failure. */ static int my_xpath_keyword(MY_XPATH *x, const char *beg, const char *end) static int my_xpath_keyword(MY_XPATH *x, struct my_xpath_keyword_names_st *keyword_names, const char *beg, const char *end) { struct my_xpath_keyword_names_st *k; size_t length= end-beg; for (k= my_keyword_names; k->name; k++) for (k= keyword_names; k->name; k++) { if (length == k->length && !strncasecmp(beg, k->name, length)) { Loading Loading @@ -1369,15 +1381,32 @@ my_xpath_lex_scan(MY_XPATH *xpath, beg+= length) /* no op */; lex->end= beg; // check if a function call if (*beg == '(' && (xpath->func= my_xpath_function(lex->beg, beg))) if (beg < end) { if (*beg == '(') { /* check if a function call, e.g.: count(/a/b) or a nodetype test, e.g.: /a/b/text() */ if ((xpath->func= my_xpath_function(lex->beg, beg))) lex->term= MY_XPATH_LEX_FUNC; else lex->term= my_xpath_keyword(xpath, my_nodetype_names, lex->beg, beg); return; } // check if an axis specifier, e.g.: /a/b/child::* else if (*beg == ':' && beg + 1 < end && beg[1] == ':') { lex->term= my_xpath_keyword(xpath, my_axis_names, lex->beg, beg); return; } } // check if a keyword lex->term= my_xpath_keyword(xpath, lex->beg, beg); lex->term= my_xpath_keyword(xpath, my_keyword_names, lex->beg, beg); return; } Loading Loading @@ -2331,6 +2360,36 @@ static int my_xpath_parse_Number(MY_XPATH *xpath) } /* Scan NCName. SYNOPSYS The keywords AND, OR, MOD, DIV are valid identitiers when they are in identifier context: SELECT ExtractValue('<and><or><mod><div>VALUE</div></mod></or></and>', '/and/or/mod/div') -> VALUE RETURN 1 - success 0 - failure */ static int my_xpath_parse_NCName(MY_XPATH *xpath) { return my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT) || my_xpath_parse_term(xpath, MY_XPATH_LEX_AND) || my_xpath_parse_term(xpath, MY_XPATH_LEX_OR) || my_xpath_parse_term(xpath, MY_XPATH_LEX_MOD) || my_xpath_parse_term(xpath, MY_XPATH_LEX_DIV) ? 1 : 0; } /* QName grammar can be found in a separate document http://www.w3.org/TR/REC-xml-names/#NT-QName Loading @@ -2339,16 +2398,17 @@ static int my_xpath_parse_Number(MY_XPATH *xpath) [7] Prefix ::= NCName [8] LocalPart ::= NCName */ static int my_xpath_parse_QName(MY_XPATH *xpath) { const char *beg; if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT)) if (!my_xpath_parse_NCName(xpath)) return 0; beg= xpath->prevtok.beg; if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_COLON)) return 1; /* Non qualified name */ if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT)) if (!my_xpath_parse_NCName(xpath)) return 0; xpath->prevtok.beg= beg; return 1; Loading