==========
PARTIAL node-set document(object, node-set?)
-NO node-set key(string, object)
+PARTIAL node-set key(string, object)
YES string format-number(number, string, string?)
YES node-set current()
YES string unparsed-entity-uri(string)
#include "xsltutils.h"
#include "functions.h"
#include "numbersInternals.h"
+#include "keys.h"
#define DEBUG_FUNCTION
*/
void
xsltKeyFunction(xmlXPathParserContextPtr ctxt, int nargs){
- TODO /* function */
+ xmlNodeSetPtr nodelist;
+ xmlXPathObjectPtr obj, tmp;
+ xmlChar *key, *value;
+ xsltTransformContextPtr tctxt;
+
+ tctxt = ((xsltTransformContextPtr)ctxt->context->extra);
+
+ if (nargs != 2) {
+ xsltGenericError(xsltGenericErrorContext,
+ "key() : expects one string arg\n");
+ ctxt->error = XPATH_INVALID_ARITY;
+ return;
+ }
+
+ obj = valuePop(ctxt);
+ if ((obj == NULL) ||
+ (ctxt->value == NULL) || (ctxt->value->type != XPATH_STRING)) {
+ xsltGenericError(xsltGenericErrorContext,
+ "generate-id() : invalid arg expecting a string\n");
+ ctxt->error = XPATH_INVALID_TYPE;
+ xmlXPathFreeObject(obj);
+
+ return;
+ }
+ tmp = valuePop(ctxt);
+ key = tmp->stringval;
+
+ /* TODO: find URI when qualified name */
+
+ if (obj->type == XPATH_NODESET) {
+ TODO /* handle NODE set as 2nd args of key() */
+ } else {
+ /*
+ * Force conversion of first arg to string
+ */
+ valuePush(ctxt, obj);
+ xmlXPathStringFunction(ctxt, 1);
+ if ((ctxt->value == NULL) || (ctxt->value->type != XPATH_STRING)) {
+ xsltGenericError(xsltGenericErrorContext,
+ "generate-id() : invalid arg expecting a string\n");
+ ctxt->error = XPATH_INVALID_TYPE;
+ xmlXPathFreeObject(obj);
+
+ return;
+ }
+ obj = valuePop(ctxt);
+ value = obj->stringval;
+
+ nodelist = xsltGetKey(tctxt, key, NULL, value);
+ valuePush(ctxt, xmlXPathWrapNodeSet(
+ xmlXPathNodeSetMerge(NULL, nodelist)));
+ }
+
+
+ if (obj != NULL)
+ xmlXPathFreeObject(obj);
+ if (tmp != NULL)
+ xmlXPathFreeObject(tmp);
}
/**
--- /dev/null
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format">
+
+<xsl:key name="idkey" match="div" use="@id"/>
+
+<xsl:template match="doc">
+<xsl:value-of select="key('idkey','lookup')"/>
+</xsl:template>
+
+</xsl:stylesheet>