1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 /* 19 * $Id: FuncTranslate.java 468655 2006-10-28 07:12:06Z minchau $ 20 */ 21 package org.apache.xpath.functions; 22 23 import org.apache.xpath.XPathContext; 24 import org.apache.xpath.objects.XObject; 25 import org.apache.xpath.objects.XString; 26 27 /** 28 * Execute the Translate() function. 29 * @xsl.usage advanced 30 */ 31 public class FuncTranslate extends Function3Args 32 { 33 static final long serialVersionUID = -1672834340026116482L; 34 35 /** 36 * Execute the function. The function must return 37 * a valid object. 38 * @param xctxt The current execution context. 39 * @return A valid XObject. 40 * 41 * @throws javax.xml.transform.TransformerException 42 */ 43 public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException 44 { 45 46 String theFirstString = m_arg0.execute(xctxt).str(); 47 String theSecondString = m_arg1.execute(xctxt).str(); 48 String theThirdString = m_arg2.execute(xctxt).str(); 49 int theFirstStringLength = theFirstString.length(); 50 int theThirdStringLength = theThirdString.length(); 51 52 // A vector to contain the new characters. We'll use it to construct 53 // the result string. 54 StringBuffer sbuffer = new StringBuffer(); 55 56 for (int i = 0; i < theFirstStringLength; i++) 57 { 58 char theCurrentChar = theFirstString.charAt(i); 59 int theIndex = theSecondString.indexOf(theCurrentChar); 60 61 if (theIndex < 0) 62 { 63 64 // Didn't find the character in the second string, so it 65 // is not translated. 66 sbuffer.append(theCurrentChar); 67 } 68 else if (theIndex < theThirdStringLength) 69 { 70 71 // OK, there's a corresponding character in the 72 // third string, so do the translation... 73 sbuffer.append(theThirdString.charAt(theIndex)); 74 } 75 else 76 { 77 78 // There's no corresponding character in the 79 // third string, since it's shorter than the 80 // second string. In this case, the character 81 // is removed from the output string, so don't 82 // do anything. 83 } 84 } 85 86 return new XString(sbuffer.toString()); 87 } 88 } 89