Hello attached updated patch with regression test
2010/8/6 Tom Lane <t...@sss.pgh.pa.us>: > Mike Fowler <m...@mlfowler.com> writes: >> SELECT >> xslt_process( ... , ... , >> 'n1=v1,n2=v2,n3=v3,n4=v4,n5=v5'::text) > > produces > >> <samples> >> <sample>v1</sample> >> <sample>v2</sample> >> <sample>v3</sample> >> <sample>v4</sample> >> <sample>v5</sample> >> </samples> > >> Sadly I get the following in both versions: > >> <samples> >> <sample/> >> <sample/> >> <sample/> >> <sample/> >> <sample/> >> </samples> > > Some examination of > http://www.xmlsoft.org/XSLT/tutorial/libxslttutorial.html > suggests that the parameter values need to be single-quoted, > and indeed when I change the last part of your example to > > 'n1=''v1'',n2=''v2'',n3=''v3'',n4=''v4'',n5=''v5'''::text); > > I get > > xslt_process > ----------------------- > <samples> + > <sample>v1</sample>+ > <sample>v2</sample>+ > <sample>v3</sample>+ > <sample>v4</sample>+ > <sample>v5</sample>+ > </samples> + > > (1 row) > > So this seems to be a documentation problem more than a code problem. > > (It's a bit distressing to notice that the regression tests for the > module fail to exercise 3-parameter xslt_process at all, though.) > ??? I don't see it Regards Pavel Stehule > regards, tom lane >
*** ./contrib/xml2/expected/xml2.out.orig 2010-02-28 22:31:57.000000000 +0100 --- ./contrib/xml2/expected/xml2.out 2010-08-06 18:46:41.000000000 +0200 *************** *** 145,147 **** --- 145,215 ---- Value</attribute></attributes>'); create index idx_xpath on t1 ( xpath_string ('/attributes/attribu...@name="attr_1"]/text()', xml_data::text)); + SELECT xslt_process('<employee><name>cim</name><age>30</age><pay>400</pay></employee>'::text, $$<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> + <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> + <xsl:strip-space elements="*"/> + <xsl:param name="n1"/> + <xsl:param name="n2"/> + <xsl:param name="n3"/> + <xsl:param name="n4"/> + <xsl:param name="n5" select="'me'"/> + <xsl:template match="*"> + <xsl:element name="samples"> + <xsl:element name="sample"> + <xsl:value-of select="$n1"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n2"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n3"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n4"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n5"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n6"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n7"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n8"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n9"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n10"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n11"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n12"/> + </xsl:element> + </xsl:element> + </xsl:template> + </xsl:stylesheet>$$::text, 'n1="v1",n2="v2",n3="v3",n4="v4",n5="v5",n6="v6",n7="v7",n8="v8",n9="v9",n10="v10",n11="v11",n12="v12"'::text); + xslt_process + ------------------------ + <samples> + + <sample>v1</sample> + + <sample>v2</sample> + + <sample>v3</sample> + + <sample>v4</sample> + + <sample>v5</sample> + + <sample>v6</sample> + + <sample>v7</sample> + + <sample>v8</sample> + + <sample>v9</sample> + + <sample>v10</sample>+ + <sample>v11</sample>+ + <sample>v12</sample>+ + </samples> + + + (1 row) + *** ./contrib/xml2/sql/xml2.sql.orig 2010-08-06 18:30:00.000000000 +0200 --- ./contrib/xml2/sql/xml2.sql 2010-08-06 18:30:57.000000000 +0200 *************** *** 80,82 **** --- 80,132 ---- create index idx_xpath on t1 ( xpath_string ('/attributes/attribu...@name="attr_1"]/text()', xml_data::text)); + + SELECT xslt_process('<employee><name>cim</name><age>30</age><pay>400</pay></employee>'::text, $$<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> + <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> + <xsl:strip-space elements="*"/> + <xsl:param name="n1"/> + <xsl:param name="n2"/> + <xsl:param name="n3"/> + <xsl:param name="n4"/> + <xsl:param name="n5" select="'me'"/> + <xsl:template match="*"> + <xsl:element name="samples"> + <xsl:element name="sample"> + <xsl:value-of select="$n1"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n2"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n3"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n4"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n5"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n6"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n7"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n8"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n9"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n10"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n11"/> + </xsl:element> + <xsl:element name="sample"> + <xsl:value-of select="$n12"/> + </xsl:element> + </xsl:element> + </xsl:template> + </xsl:stylesheet>$$::text, 'n1="v1",n2="v2",n3="v3",n4="v4",n5="v5",n6="v6",n7="v7",n8="v8",n9="v9",n10="v10",n11="v11",n12="v12"'::text); *** ./contrib/xml2/xslt_proc.c.orig 2010-07-06 21:18:55.000000000 +0200 --- ./contrib/xml2/xslt_proc.c 2010-08-06 18:39:02.000000000 +0200 *************** *** 41,49 **** extern void pgxml_parser_init(void); /* local defs */ ! static void parse_params(const char **params, text *paramstr); ! #define MAXPARAMS 20 /* must be even, see parse_params() */ #endif /* USE_LIBXSLT */ --- 41,50 ---- extern void pgxml_parser_init(void); /* local defs */ ! const char **parse_params(text *paramstr); ! #define INIT_PARAMS 20 /* must be even, see parse_params() */ ! #define EXTEND_PARAMS 20 /* must be even, see parse_params() */ #endif /* USE_LIBXSLT */ *************** *** 57,63 **** text *doct = PG_GETARG_TEXT_P(0); text *ssheet = PG_GETARG_TEXT_P(1); text *paramstr; ! const char *params[MAXPARAMS + 1]; /* +1 for the terminator */ xsltStylesheetPtr stylesheet = NULL; xmlDocPtr doctree; xmlDocPtr restree; --- 58,64 ---- text *doct = PG_GETARG_TEXT_P(0); text *ssheet = PG_GETARG_TEXT_P(1); text *paramstr; ! const char **params; xsltStylesheetPtr stylesheet = NULL; xmlDocPtr doctree; xmlDocPtr restree; *************** *** 69,79 **** if (fcinfo->nargs == 3) { paramstr = PG_GETARG_TEXT_P(2); ! parse_params(params, paramstr); } else /* No parameters */ params[0] = NULL; /* Setup parser */ pgxml_parser_init(); --- 70,83 ---- if (fcinfo->nargs == 3) { paramstr = PG_GETARG_TEXT_P(2); ! params = parse_params(paramstr); } else + { /* No parameters */ + params = palloc(sizeof(char *)); params[0] = NULL; + } /* Setup parser */ pgxml_parser_init(); *************** *** 139,160 **** #ifdef USE_LIBXSLT ! static void ! parse_params(const char **params, text *paramstr) { char *pos; char *pstr; - int i; char *nvsep = "="; char *itsep = ","; ! pstr = text_to_cstring(paramstr); pos = pstr; ! ! for (i = 0; i < MAXPARAMS; i++) { ! params[i] = pos; pos = strstr(pos, nvsep); if (pos != NULL) { --- 143,175 ---- #ifdef USE_LIBXSLT ! const char ** ! parse_params(text *paramstr) { char *pos; char *pstr; char *nvsep = "="; char *itsep = ","; ! const char **params; ! int nparams; ! int max_params; /* max params */ ! pstr = text_to_cstring(paramstr); + + max_params = INIT_PARAMS; + params = (const char **) palloc(INIT_PARAMS * sizeof(char *) + 1); pos = pstr; ! nparams = 0; ! while (*pos != '\0') { ! if (nparams >= max_params) ! { ! /* extend params params */ ! max_params += EXTEND_PARAMS; ! params = (const char **) repalloc(params, max_params * sizeof(char *) + 1); ! } ! params[nparams++] = pos; pos = strstr(pos, nvsep); if (pos != NULL) { *************** *** 165,176 **** { /* No equal sign, so ignore this "parameter" */ /* We'll reset params[i] to NULL below the loop */ break; } ! /* Value */ ! i++; /* since MAXPARAMS is even, we still have i < MAXPARAMS */ ! params[i] = pos; pos = strstr(pos, itsep); if (pos != NULL) { --- 180,191 ---- { /* No equal sign, so ignore this "parameter" */ /* We'll reset params[i] to NULL below the loop */ + nparams--; break; } ! /* since MAXPARAMS is even, we still have i < MAXPARAMS */ ! params[nparams++] = pos; pos = strstr(pos, itsep); if (pos != NULL) { *************** *** 178,190 **** pos++; } else - { - i++; break; - } } ! params[i] = NULL; } #endif /* USE_LIBXSLT */ --- 193,204 ---- pos++; } else break; } ! params[nparams] = NULL; ! ! return params; } #endif /* USE_LIBXSLT */
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers