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    */
execute(XPathContext xctxt)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