/** * Process this instruction * * @param context the dynamic context of the transformation * @return a TailCall to be executed by the caller, always null for this instruction */ public TailCall processLeavingTail(XPathContext context) throws XPathException { Controller controller = context.getController(); SequenceReceiver out = context.getReceiver(); int opt = options; int ann = annotation; // we may need to change the namespace prefix if the one we chose is // already in use with a different namespace URI: this is done behind the scenes // by the Outputter CharSequence value = expandChildren(context); if (schemaType != null) { // test whether the value actually conforms to the given type XPathException err = schemaType.validateContent( value, DummyNamespaceResolver.getInstance(), context.getConfiguration().getNameChecker()); if (err != null) { ValidationException verr = new ValidationException( "Attribute value " + Err.wrap(value, Err.VALUE) + " does not the match the required type " + schemaType.getDescription() + ". " + err.getMessage()); verr.setErrorCode("XTTE1540"); verr.setLocator(this); throw verr; } } else if (validationAction == Validation.STRICT || validationAction == Validation.LAX) { try { ann = controller.getConfiguration().validateAttribute(nameCode, value, validationAction); } catch (ValidationException e) { DynamicError err = DynamicError.makeDynamicError(e); String errorCode = e.getErrorCodeLocalPart(); if (errorCode == null) { errorCode = (validationAction == Validation.STRICT ? "XTTE1510" : "XTTE1515"); } err.setErrorCode(errorCode); err.setXPathContext(context); err.setLocator(this); err.setIsTypeError(true); throw err; } } try { out.attribute(nameCode, ann, value, locationId, opt); } catch (XPathException err) { throw dynamicError(this, err, context); } return null; }
/** Evaluate in a general context */ public Item evaluateItem(XPathContext c) throws XPathException { StringValue sv = (StringValue) argument[0].evaluateItem(c); if (sv == null) { return StringValue.EMPTY_STRING; } byte fb = Normalizer.C; if (argument.length == 2) { String form = argument[1].evaluateAsString(c).trim(); if (form.equalsIgnoreCase("NFC")) { fb = Normalizer.C; } else if (form.equalsIgnoreCase("NFD")) { fb = Normalizer.D; } else if (form.equalsIgnoreCase("NFKC")) { fb = Normalizer.KC; } else if (form.equalsIgnoreCase("NFKD")) { fb = Normalizer.KD; } else if (form.equalsIgnoreCase("")) { return sv; } else { String msg = "Normalization form " + form + " is not supported"; DynamicError err = new DynamicError(msg); err.setErrorCode("FOCH0003"); err.setXPathContext(c); err.setLocator(this); throw err; } } // fast path for ASCII strings: normalization is a no-op boolean allASCII = true; CharSequence chars = sv.getStringValueCS(); if (chars instanceof CompressedWhitespace) { return sv; } for (int i = chars.length() - 1; i >= 0; i--) { if (chars.charAt(i) > 127) { allASCII = false; break; } } if (allASCII) { return sv; } Normalizer norm = new Normalizer(fb); CharSequence result = norm.normalize(sv.getStringValueCS()); return StringValue.makeStringValue(result); }
public Item evaluateItem(XPathContext context) throws XPathException { Orphan o = (Orphan) super.evaluateItem(context); if (schemaType != null) { XPathException err = schemaType.validateContent( o.getStringValueCS(), DummyNamespaceResolver.getInstance(), context.getConfiguration().getNameChecker()); if (err != null) { throw new ValidationException( "Attribute value " + Err.wrap(o.getStringValueCS(), Err.VALUE) + " does not the match the required type " + schemaType.getDescription() + ". " + err.getMessage()); } o.setTypeAnnotation(schemaType.getFingerprint()); if (schemaType.isNamespaceSensitive()) { throw new DynamicError( "Cannot validate a parentless attribute whose content is namespace-sensitive"); } } else if (validationAction == Validation.STRICT || validationAction == Validation.LAX) { try { int ann = context .getController() .getConfiguration() .validateAttribute(nameCode, o.getStringValueCS(), validationAction); o.setTypeAnnotation(ann); } catch (ValidationException e) { DynamicError err = DynamicError.makeDynamicError(e); err.setErrorCode(e.getErrorCodeLocalPart()); err.setXPathContext(context); err.setLocator(this); err.setIsTypeError(true); throw err; } } return o; }