1
0
mirror of https://gitlab.gnome.org/GNOME/libxslt synced 2025-11-05 12:10:38 +03:00

fixed bug #78735 added the tests in a separate directory Daniel

* libxslt/keys.c: fixed bug #78735
* configure.in tests/Makefile.am tests/keys/*:
  added the tests in a separate directory
Daniel
This commit is contained in:
Daniel Veillard
2002-04-15 12:02:03 +00:00
parent 4ec7719012
commit 42681a3efe
9 changed files with 177 additions and 16 deletions

View File

@@ -1,3 +1,9 @@
Mon Apr 15 14:00:12 CEST 2002 Daniel Veillard <daniel@veillard.com>
* libxslt/keys.c: fixed bug #78735
* configure.in tests/Makefile.am tests/keys/*:
added the tests in a separate directory
Mon Apr 15 00:01:07 CEST 2002 Daniel Veillard <daniel@veillard.com>
* tests/docs/Makefile.am tests/docs/bug-83.xml

View File

@@ -421,6 +421,7 @@ tests/general/Makefile
tests/reports/Makefile
tests/extensions/Makefile
tests/namespaces/Makefile
tests/keys/Makefile
tests/numbers/Makefile
tests/documents/Makefile
tests/xmlspec/Makefile

View File

@@ -356,6 +356,88 @@ xsltGetKey(xsltTransformContextPtr ctxt, const xmlChar *name,
return(NULL);
}
/**
* xsltEvalXPathKeys:
* @ctxt: the XSLT transformation context
* @comp: the compiled XPath expression
*
* Process the expression using XPath to get the list of keys
*
* Returns the array of computed string value or NULL, must be deallocated
* by the caller.
*/
static xmlChar **
xsltEvalXPathKeys(xsltTransformContextPtr ctxt, xmlXPathCompExprPtr comp) {
xmlChar **ret = NULL;
xmlXPathObjectPtr res;
xmlNodePtr oldInst;
xmlNodePtr oldNode;
int oldPos, oldSize;
int oldNsNr;
xmlNsPtr *oldNamespaces;
oldInst = ctxt->inst;
oldNode = ctxt->node;
oldPos = ctxt->xpathCtxt->proximityPosition;
oldSize = ctxt->xpathCtxt->contextSize;
oldNsNr = ctxt->xpathCtxt->nsNr;
oldNamespaces = ctxt->xpathCtxt->namespaces;
ctxt->xpathCtxt->node = ctxt->node;
/* TODO: do we need to propagate the namespaces here ? */
ctxt->xpathCtxt->namespaces = NULL;
ctxt->xpathCtxt->nsNr = 0;
res = xmlXPathCompiledEval(comp, ctxt->xpathCtxt);
if (res != NULL) {
if (res->type == XPATH_NODESET) {
int len, i, j;
if (res->nodesetval != NULL)
len = res->nodesetval->nodeNr;
if (len != 0) {
ret = (xmlChar **) xmlMalloc((len + 1) * sizeof(xmlChar *));
if (ret != NULL) {
for (i = 0,j = 0;i < len;i++) {
ret[j] = xmlXPathCastNodeToString(
res->nodesetval->nodeTab[i]);
if (ret[j] != NULL)
j++;
}
ret[j] = NULL;
}
}
} else {
if (res->type != XPATH_STRING)
res = xmlXPathConvertString(res);
if (res->type == XPATH_STRING) {
ret = (xmlChar **) xmlMalloc(2 * sizeof(xmlChar *));
if (ret != NULL) {
ret[0] = res->stringval;
ret[1] = NULL;
res->stringval = NULL;
}
} else {
xsltPrintErrorContext(ctxt, NULL, NULL);
xsltGenericError(xsltGenericErrorContext,
"xpath : string() function didn't return a String\n");
}
}
xmlXPathFreeObject(res);
} else {
ctxt->state = XSLT_STATE_STOPPED;
}
#ifdef WITH_XSLT_DEBUG_TEMPLATES
xsltGenericDebug(xsltGenericDebugContext,
"xsltEvalXPathString: returns %s\n", ret);
#endif
ctxt->inst = oldInst;
ctxt->node = oldNode;
ctxt->xpathCtxt->contextSize = oldSize;
ctxt->xpathCtxt->proximityPosition = oldPos;
ctxt->xpathCtxt->nsNr = oldNsNr;
ctxt->xpathCtxt->namespaces = oldNamespaces;
return(ret);
}
/**
* xsltInitCtxtKey:
* @ctxt: an XSLT transformation context
@@ -370,7 +452,7 @@ xsltInitCtxtKey(xsltTransformContextPtr ctxt, xsltDocumentPtr doc,
int i;
xmlNodeSetPtr nodelist = NULL, keylist;
xmlXPathObjectPtr res = NULL;
xmlChar *str;
xmlChar *str, **list;
xsltKeyTablePtr table;
int oldPos, oldSize;
xmlNodePtr oldInst;
@@ -447,26 +529,34 @@ xsltInitCtxtKey(xsltTransformContextPtr ctxt, xsltDocumentPtr doc,
for (i = 0;i < nodelist->nodeNr;i++) {
if (IS_XSLT_REAL_NODE(nodelist->nodeTab[i])) {
ctxt->node = nodelist->nodeTab[i];
str = xsltEvalXPathString(ctxt, keyd->usecomp);
if (str != NULL) {
list = xsltEvalXPathKeys(ctxt, keyd->usecomp);
if (list != NULL) {
int index = 0;
str = list[index++];
while (str != NULL) {
#ifdef WITH_XSLT_DEBUG_KEYS
xsltGenericDebug(xsltGenericDebugContext,
"xsl:key : node associated to(%s,%s)\n",
keyd->name, str);
xsltGenericDebug(xsltGenericDebugContext,
"xsl:key : node associated to(%s,%s)\n",
keyd->name, str);
#endif
keylist = xmlHashLookup(table->keys, str);
if (keylist == NULL) {
keylist = xmlXPathNodeSetCreate(nodelist->nodeTab[i]);
xmlHashAddEntry(table->keys, str, keylist);
} else {
xmlXPathNodeSetAdd(keylist, nodelist->nodeTab[i]);
keylist = xmlHashLookup(table->keys, str);
if (keylist == NULL) {
keylist = xmlXPathNodeSetCreate(nodelist->nodeTab[i]);
xmlHashAddEntry(table->keys, str, keylist);
} else {
xmlXPathNodeSetAdd(keylist, nodelist->nodeTab[i]);
}
nodelist->nodeTab[i]->_private = keyd;
xmlFree(str);
str = list[index++];
}
nodelist->nodeTab[i]->_private = keyd;
xmlFree(str);
xmlFree(list);
#ifdef WITH_XSLT_DEBUG_KEYS
} else {
xsltGenericDebug(xsltGenericDebugContext,
"xsl:key : use %s failed to return a string\n",
"xsl:key : use %s failed to return strings\n",
keyd->use);
#endif
}

View File

@@ -1,6 +1,6 @@
## Process this file with automake to produce Makefile.in
SUBDIRS=docs REC1 REC2 REC general namespaces numbers documents \
SUBDIRS=docs REC1 REC2 REC general namespaces keys numbers documents \
extensions reports xmlspec multiple XSLTMark docbook exslt
all:

22
tests/keys/Makefile.am Normal file
View File

@@ -0,0 +1,22 @@
## Process this file with automake to produce Makefile.in
$(top_builddir)/xsltproc/xsltproc:
@(cd ../../xsltproc ; $(MAKE) xsltproc)
EXTRA_DIST = dates.xml month.xml month.xsl month.out
all:
valgrind:
@echo '## Running the regression tests under Valgrind'
$(MAKE) CHECKER='valgrind -q' tests
test tests: $(top_builddir)/xsltproc/xsltproc
@(echo > .memdump)
@($(CHECKER) $(top_builddir)/xsltproc/xsltproc $(srcdir)/month.xsl $(srcdir)/dates.xml > month.res ; \
if [ -r $(srcdir)/month.out ] ; \
then diff $(srcdir)/month.out month.res ; \
else mv month.res $(srcdir)/month.out ; fi ; \
grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" || true;\
rm -f month.res)

7
tests/keys/dates.xml Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<dates>
<month>12</month>
<month>Dec</month>
<month>December</month>
<month>dismember</month>
</dates>

7
tests/keys/month.out Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<dates>
<month>December</month>
<month>December</month>
<month>December</month>
<month></month>
</dates>

9
tests/keys/month.xml Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<list>
<month>
<alias>December</alias>
<alias>12</alias>
<alias>Dec</alias>
<alias>DEC</alias>
</month>
</list>

19
tests/keys/month.xsl Normal file
View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="no" version="1.0" encoding="iso-8859-1"/>
<xsl:key name="monthlist" match="/list/month" use="./alias"/>
<xsl:template match="month">
<month>
<xsl:variable name="value" select="."/>
<xsl:for-each select="document('month.xml')">
<xsl:value-of select="key('monthlist', $value)/alias[1]"/>
</xsl:for-each>
</month>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>