diff --git a/libxslt/functions.c b/libxslt/functions.c
index c4399771d24be5a43cedd7a7a5b69d30f47bf27f_bGlieHNsdC9mdW5jdGlvbnMuYw==..2d178bddf99d9a929e0db6fdda7e690b10b76898_bGlieHNsdC9mdW5jdGlvbnMuYw== 100644
--- a/libxslt/functions.c
+++ b/libxslt/functions.c
@@ -608,7 +608,8 @@
 
     switch (nargs) {
     case 3:
-	CAST_TO_STRING;
+        if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING))
+            xmlXPathStringFunction(ctxt, 1);
 	decimalObj = valuePop(ctxt);
         ncname = xsltSplitQName(sheet->dict, decimalObj->stringval, &prefix);
         if (prefix != NULL) {
@@ -634,5 +635,6 @@
 	}
 	/* Intentional fall-through */
     case 2:
-	CAST_TO_STRING;
+        if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING))
+            xmlXPathStringFunction(ctxt, 1);
 	formatObj = valuePop(ctxt);
@@ -638,5 +640,6 @@
 	formatObj = valuePop(ctxt);
-	CAST_TO_NUMBER;
+        if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_NUMBER))
+            xmlXPathNumberFunction(ctxt, 1);
 	numberObj = valuePop(ctxt);
 	break;
     default:
@@ -640,7 +643,8 @@
 	numberObj = valuePop(ctxt);
 	break;
     default:
-	XP_ERROR(XPATH_INVALID_ARITY);
+	xmlXPathErr(ctxt, XPATH_INVALID_ARITY);
+        return;
     }
 
     if (formatValues != NULL) {
diff --git a/libxslt/pattern.c b/libxslt/pattern.c
index c4399771d24be5a43cedd7a7a5b69d30f47bf27f_bGlieHNsdC9wYXR0ZXJuLmM=..2d178bddf99d9a929e0db6fdda7e690b10b76898_bGlieHNsdC9wYXR0ZXJuLmM= 100644
--- a/libxslt/pattern.c
+++ b/libxslt/pattern.c
@@ -1264,7 +1264,6 @@
 	cur += len;
 	CUR_PTR = cur;
     } else {
-	/* XP_ERROR(XPATH_START_LITERAL_ERROR); */
 	ctxt->error = 1;
 	return(NULL);
     }