Re: [xslt] How I can detect processing errors ?
- From: Vladimir Grebenschikov <vova sw ru>
- To: xslt gnome org
- Subject: Re: [xslt] How I can detect processing errors ?
- Date: Wed, 03 Mar 2004 14:32:52 +0300
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]