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

Reply via email to