Re: [xslt] How I can detect processing errors ?



On ср, 2004-03-03 at 05:49 -0500, Daniel Veillard wrote:

>   No sensible analysis can be done with the data you provided.
> Please read http://xmlsoft.org/XSLT/bugs.html

Ok, more details (all files in attachments):

StyleSheet:

---
<xsl:variable name="skinObj" select="document('skins.xml')/skins/skin
[name = $skin]"/>
<xsl:variable name="menuType" select="$skinObj/menu"/>

<xsl:template match="/">
    <xsl:copy-of select="$menuType"/>;
</xsl:template>
----
skins.xml exists and valid,
input XML does not matter (single node)

execute test program ($skin not defined - should be error)
---------------------
% ./xslttest test.xsl test.xml
runtime error: file test.xsl line 6 element variable
unregistered variable skin
xmlXPathCompiledEval: 1 object left on the stack
runtime error: file test.xsl line 6 element variable
Evaluating global variable   being computed ...  failed
runtime error: file test.xsl line 6 element variable
unregistered variable skin
xmlXPathCompiledEval: 1 object left on the stack
runtime error: file test.xsl line 6 element variable
Evaluating global variable   being computed ...  failed
runtime error: file test.xsl line 7 element variable
unregistered variable skinObj
xmlXPathCompiledEval: evaluation failed
runtime error: file test.xsl line 7 element variable
Evaluating global variable   being computed ...  failed

xslttest: xsltSaveResultToString() returns 0, size = 0, ptr = 0
---------------------
We see - both xsltApplyStylesheet(), xsltSaveResultToString()
does not return error, but xsltApplyStylesheet() should.

Let's try with $skin defined:
% ./xslttest --param skin blue test.xsl test.xml
xslttest: xsltSaveResultToString() returns 0, size = 5, ptr = 804da50
%
All is Ok.

Part of program: (see attachment for full)

   doc = xmlParseFile(argv[i]);
   res = xsltApplyStylesheet(cur, doc, params);
   if (!res) errx(-1, "fail to do xsltApplyStylesheet()");

   rc = xsltSaveResultToString((xmlChar **)&buf, &size, res, cur);
   warnx("xsltSaveResultToString() returns %d, size = %d, ptr = %lx",
rc, size, buf);

So it is not possible to detect this error on transformation stage.

> Daniel

-- 
Vladimir B. Grebenschikov
SWsoft Inc.
<?xml version="1.0"?>

<skins>
	<skin>
	  <name>ice</name>
	  <default>no</default>
	  <layout>non-framed</layout>
	  <menu>static</menu>
	  <buttons>text</buttons>
	</skin>
</skins>
<x>
</x>
<xsl:stylesheet version="1.0" extension-element-prefixes="xsl"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; > 

<xsl:output method="html" encoding="utf-8"/>

<xsl:variable name="skinObj" select="document('skins.xml')/skins/skin[name = $skin]"/>
<xsl:variable name="menuType" select="$skinObj/menu"/>

  <xsl:template match="/">
    <xsl:copy-of select="$menuType"/>;
  </xsl:template>

</xsl:stylesheet>
/*
 * libxslt_tutorial.c: demo program for the XSL Transformation 1.0 engine
 *
 * based on xsltproc.c, by Daniel.Veillard@imag.fr
 * by John Fleck 
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc.,  59 Temple Place - Suite 330, Cambridge, MA 02139, USA.
 *
 */ 

#include <string.h>
#include <libxml/xmlmemory.h>
#include <libxml/debugXML.h>
#include <libxml/HTMLtree.h>
#include <libxml/xmlIO.h>
#include <libxml/xinclude.h>
#include <libxml/catalog.h>
#include <libxslt/xslt.h>
#include <libxslt/xsltInternals.h>
#include <libxslt/transform.h>
#include <libxslt/xsltutils.h>
#include <libexslt/exslt.h>

#include <err.h>

extern int xmlLoadExtDtdDefaultValue;

static void usage(const char *name) {
    printf("Usage: %s [options] stylesheet file [file ...]\n", name);
    printf("      --param name value : pass a (parameter,value) pair\n");

}

int
main(int argc, char **argv) {
        int i, rc, size;
        char *buf;
        const char *params[16 + 1];
        int nbparams = 0;
        xsltStylesheetPtr cur = NULL;
        xmlDocPtr doc, res;

        if (argc <= 1) {
                usage(argv[0]);
                return(1);
        }

        for (i = 1; i < argc; i++) {
                if (argv[i][0] != '-')
                        break;
                if ((!strcmp(argv[i], "-param")) ||
                    (!strcmp(argv[i], "--param"))) {
                        i++;
                        params[nbparams++] = argv[i++];
                        params[nbparams++] = argv[i];
                        if (nbparams >= 16) {
                                fprintf(stderr, "too many params\n");
                                return (1);
                        }
                }  else {
                        fprintf(stderr, "Unknown option %s\n", argv[i]);
                        usage(argv[0]);
                        return (1);
                }
        }
        
        params[nbparams] = NULL;
        xmlSubstituteEntitiesDefault(1);
        xmlLoadExtDtdDefaultValue = 1;

        //if (xslExtensionsRegister())
        //        errx(-2, "Extension registration failed\n");                

        exsltRegisterAll();

	//xsltDebugDumpExtensions(stdout);

        cur = xsltParseStylesheetFile((const xmlChar *)argv[i]);
        i++;
        doc = xmlParseFile(argv[i]);
        res = xsltApplyStylesheet(cur, doc, params);
        if (!res)
        	errx(-1, "fail to do xsltApplyStylesheet()");
        
        /*	
        rc = xsltSaveResultToFile(stdout, res, cur);
        warnx("xsltSaveResultToFile() returns %d", rc);
        */
        rc = xsltSaveResultToString((xmlChar **)&buf, &size, res, cur);
        warnx("xsltSaveResultToString() returns %d, size = %d, ptr = %lx", rc, size, buf);
        
        xsltFreeStylesheet(cur);
        xmlFreeDoc(res);
        xmlFreeDoc(doc);
        
        xsltCleanupGlobals();
        xmlCleanupParser();
        return(0);
        
}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]