From 68a06e116b8645295c314dfad8cc2ba4926ef5b7 Mon Sep 17 00:00:00 2001 From: "William M. Brack" Date: Mon, 18 Aug 2003 06:50:15 +0000 Subject: [PATCH] enhanced xsltInitCtxtKey to take care of multiple instances of a key with * keys.c: enhanced xsltInitCtxtKey to take care of multiple instances of a key with the same namespace:name, reported on the mailing list by Ian Young. Added regression test (bug-128). --- ChangeLog | 7 +++++++ libxslt/keys.c | 30 ++++++++++++++++++++++++------ tests/docs/Makefile.am | 1 + tests/docs/bug-128.xml | 26 ++++++++++++++++++++++++++ tests/general/Makefile.am | 1 + tests/general/bug-128.out | 5 +++++ tests/general/bug-128.xsl | 26 ++++++++++++++++++++++++++ 7 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 tests/docs/bug-128.xml create mode 100644 tests/general/bug-128.out create mode 100644 tests/general/bug-128.xsl diff --git a/ChangeLog b/ChangeLog index 67335c9..35edb81 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Mod Aug 18 14:42:12 HKT 2003 William Brack + + * keys.c: enhanced xsltInitCtxtKey to take care of multiple + instances of a key with the same namespace:name, reported + on the mailing list by Ian Young. Added regression test + (bug-128). + Thu Aug 15 13:00:02 HKT 2003 William Brack * variables.c: fixed bug 119699 (missing error on shadowed diff --git a/libxslt/keys.c b/libxslt/keys.c index 4178c1c..f3a1f63 100644 --- a/libxslt/keys.c +++ b/libxslt/keys.c @@ -519,9 +519,30 @@ xsltInitCtxtKey(xsltTransformContextPtr ctxt, xsltDocumentPtr doc, if ((nodelist == NULL) || (nodelist->nodeNr <= 0)) goto error; - table = xsltNewKeyTable(keyd->name, keyd->nameURI); - if (table == NULL) - goto error; + /** + * Multiple key definitions for the same name are allowed, so + * we must check if the key is already present for this doc + */ + table = (xsltKeyTablePtr) doc->keys; + while (table != NULL) { + if (xmlStrEqual(table->name, keyd->name) && + (((keyd->nameURI == NULL) && (table->nameURI == NULL)) || + ((keyd->nameURI != NULL) && (table->nameURI != NULL) && + (xmlStrEqual(table->nameURI, keyd->nameURI))))) + break; + table = table->next; + } + /** + * If the key was not previously defined, create it now and + * chain it to the list of keys for the doc + */ + if (table == NULL) { + table = xsltNewKeyTable(keyd->name, keyd->nameURI); + if (table == NULL) + goto error; + table->next = doc->keys; + doc->keys = table; + } for (i = 0;i < nodelist->nodeNr;i++) { if (IS_XSLT_REAL_NODE(nodelist->nodeTab[i])) { @@ -560,9 +581,6 @@ xsltInitCtxtKey(xsltTransformContextPtr ctxt, xsltDocumentPtr doc, } } - table->next = doc->keys; - doc->keys = table; - error: ctxt->document = oldDoc; ctxt->xpathCtxt->doc = oldXDoc; diff --git a/tests/docs/Makefile.am b/tests/docs/Makefile.am index 873b4b1..cf40b49 100644 --- a/tests/docs/Makefile.am +++ b/tests/docs/Makefile.am @@ -127,6 +127,7 @@ EXTRA_DIST = \ bug-125.xml \ bug-126.xml \ bug-127.xml \ + bug-128.xml \ character.xml \ array.xml \ items.xml diff --git a/tests/docs/bug-128.xml b/tests/docs/bug-128.xml new file mode 100644 index 0000000..0a3027d --- /dev/null +++ b/tests/docs/bug-128.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/general/Makefile.am b/tests/general/Makefile.am index a37d449..300235a 100644 --- a/tests/general/Makefile.am +++ b/tests/general/Makefile.am @@ -132,6 +132,7 @@ EXTRA_DIST = \ bug-125.out bug-125.xsl \ bug-126.out bug-126.xsl \ bug-127.out bug-127.xsl \ + bug-128.out bug-128.xsl \ character.out character.xsl \ character2.out character2.xsl \ itemschoose.out itemschoose.xsl \ diff --git a/tests/general/bug-128.out b/tests/general/bug-128.out new file mode 100644 index 0000000..31a5e2e --- /dev/null +++ b/tests/general/bug-128.out @@ -0,0 +1,5 @@ + + + + + diff --git a/tests/general/bug-128.xsl b/tests/general/bug-128.xsl new file mode 100644 index 0000000..0a3027d --- /dev/null +++ b/tests/general/bug-128.xsl @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + -- 2.7.4