mmidy 2002/09/13 12:59:58
Modified: java/src/org/apache/xalan/templates Tag: xslt20
ElemAnalyzeString.java ElemMatchingSubstring.java
java/src/org/apache/xml/dtm Tag: xslt20 XType.java
java/src/org/apache/xpath Tag: xslt20 Expression.java
java/src/org/apache/xpath/functions Tag: xslt20
FuncReplace.java FuncTokenize.java
java/src/org/apache/xpath/parser Tag: xslt20 SimpleNode.java
Added: java/src/org/apache/xpath/functions Tag: xslt20
FuncEmpty.java FuncExists.java FuncIndexOf.java
FuncItemAt.java
Log:
New functions: empty(), index-of(), exists(), item-at()
Fix misc problems with regular expressions
Revision Changes Path
No revision
No revision
1.1.2.3 +22 -6
xml-xalan/java/src/org/apache/xalan/templates/Attic/ElemAnalyzeString.java
Index: ElemAnalyzeString.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/templates/Attic/ElemAnalyzeString.java,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- ElemAnalyzeString.java 19 Aug 2002 22:44:13 -0000 1.1.2.2
+++ ElemAnalyzeString.java 13 Sep 2002 19:59:56 -0000 1.1.2.3
@@ -336,18 +336,34 @@
{
if(tokenTree.size() > 0)
{
- for(i=0; i<tokenTree.size(); i++)
+ for(i=0; i<tokenTree.size() && index<length; i++)
{
child = tokenTree.getChild(i);
- regexp.compileToken(child);
- int[] range = regexp.matchString(selectResult, index,
length);
- int start = range[0];
+ int[] range;
+ // Needs review!!! See regex020, E4...
+ if (child.getType() == Token.PAREN &&
+ (i+1 < tokenTree.size()) &&
+ tokenTree.getChild(i+1).getType() == Token.CHAR)
+ {
+ regexp.compileToken(tokenTree.getChild(i+1));
+ range = regexp.matchString(selectResult, index,
length);
+ int start = range[0] > length ? length : range[0];
+ regexp.compileToken(child);
+ range = regexp.matchString(selectResult, index, start);
+ }
+ else
+ {
+ regexp.compileToken(child);
+ range = regexp.matchString(selectResult, index,
length);
+ }
+ int start = range[0];
int end = range[1];
if (end >=0)
{
if (child.getType() == Token.PAREN)
- matchSeq.insertItemAt(new XString(selectResult.substring(start,
end)), t++);
- noMatchSeq.insertItemAt(new
XString(selectResult.substring(index, start)), j++);
+ matchSeq.insertItemAt(new
XString(selectResult.substring(start, end)), t++);
+ if (index != start)
+ noMatchSeq.insertItemAt(new
XString(selectResult.substring(index, start)), j++);
index = end;
}
else
1.1.2.2 +2 -2
xml-xalan/java/src/org/apache/xalan/templates/Attic/ElemMatchingSubstring.java
Index: ElemMatchingSubstring.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/templates/Attic/ElemMatchingSubstring.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- ElemMatchingSubstring.java 16 Aug 2002 21:23:47 -0000 1.1.2.1
+++ ElemMatchingSubstring.java 13 Sep 2002 19:59:56 -0000 1.1.2.2
@@ -196,7 +196,7 @@
xctxt.pushCurrentItem(XSequence.EMPTY);
- int currentNodePos = xctxt.getCurrentNodeFirstFree() - 1;
+ //int currentNodePos = xctxt.getCurrentNodeFirstFree() - 1;
xctxt.pushCurrentExpressionNode(DTM.NULL);
@@ -212,7 +212,7 @@
XObject item;
//for each item in the population, evaluate the expression
- // while (null != (item = m_substringSequence.next()))
+ //while (null != (item = m_substringSequence.next()))
if (null != (item = m_substringSequence.next()))
{
xctxt.setCurrentItem(item);
No revision
No revision
1.1.2.1.2.1 +2 -1 xml-xalan/java/src/org/apache/xml/dtm/Attic/XType.java
Index: XType.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/dtm/Attic/XType.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.1.2.1
diff -u -r1.1.2.1 -r1.1.2.1.2.1
--- XType.java 14 Aug 2002 19:45:33 -0000 1.1.2.1
+++ XType.java 13 Sep 2002 19:59:57 -0000 1.1.2.1.2.1
@@ -140,7 +140,8 @@
"yearMonthDuration", // YEARMONTHDURATION = 23;
"dayTimeDuration", // DAYTIMEDURATION = 24;
"AnySimpleType", // ANYSIMPLETYPE = 25;
- "EMPTY" // EMPTYSEQ = 26;
+ "EMPTY", // EMPTYSEQ = 26;
+ "sequence" // SEQ = 27;
};
public static final int NOTHOMOGENOUS = 0xFFFFFFFF;
No revision
No revision
1.18.4.1.2.1 +41 -0 xml-xalan/java/src/org/apache/xpath/Expression.java
Index: Expression.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/Expression.java,v
retrieving revision 1.18.4.1
retrieving revision 1.18.4.1.2.1
diff -u -r1.18.4.1 -r1.18.4.1.2.1
--- Expression.java 14 Aug 2002 20:06:56 -0000 1.18.4.1
+++ Expression.java 13 Sep 2002 19:59:57 -0000 1.18.4.1.2.1
@@ -64,10 +64,12 @@
import javax.xml.transform.TransformerException;
import org.apache.xalan.res.XSLMessages;
import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.XType;
import org.apache.xml.dtm.DTMIterator;
import org.apache.xml.utils.XMLString;
import org.apache.xpath.objects.XNodeSet;
import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XSequence;
import org.apache.xpath.parser.SimpleNode;
import org.apache.xpath.res.XPATHErrorResources;
import org.xml.sax.ContentHandler;
@@ -246,6 +248,45 @@
throws javax.xml.transform.TransformerException
{
return execute(xctxt).xstr();
+ }
+
+ /**
+ * Cast result object to a string.
+ *
+ *
+ * @param xctxt The XPath runtime context.
+ * @return The string this wraps or the empty string if null
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public String strOrNull(XPathContext xctxt)
+ throws javax.xml.transform.TransformerException
+ {
+ XObject obj = execute(xctxt);
+ if(obj instanceof XSequence)
+ {
+ XSequence seq = (XSequence)obj;
+ int len = seq.getLength();
+ if(len > 1) //!seq.isSingletonOrEmpty())
+ {
+ this.error(xctxt, XPATHErrorResources.ER_CANT_CONVERT_TO_TYPE,new
Object[]{XType.getLocalNameFromType(XType.SEQ),
XType.getLocalNameFromType(XType.STRING)});
+ return null;
+ }
+ else
+ {
+ if (len == 0)
+ return null;
+ else
+ return obj.str();
+ }
+ }
+ else
+ {
+ if (obj.object() == null)
+ return null;
+ else
+ return obj.str();
+ }
}
/**
No revision
No revision
1.1.2.5 +10 -3
xml-xalan/java/src/org/apache/xpath/functions/Attic/FuncReplace.java
Index: FuncReplace.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/functions/Attic/FuncReplace.java,v
retrieving revision 1.1.2.4
retrieving revision 1.1.2.5
diff -u -r1.1.2.4 -r1.1.2.5
--- FuncReplace.java 28 Aug 2002 15:39:24 -0000 1.1.2.4
+++ FuncReplace.java 13 Sep 2002 19:59:57 -0000 1.1.2.5
@@ -62,6 +62,7 @@
import org.apache.xpath.XPathContext;
import org.apache.xpath.objects.XObject;
import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XSequence;
import org.apache.xpath.parser.regexp.*;
import org.apache.xalan.res.XSLMessages;
@@ -82,9 +83,13 @@
*/
public XObject execute(XPathContext xctxt) throws
javax.xml.transform.TransformerException
{
- String input = m_arg0.execute(xctxt).str();
- String pattern = m_arg1.execute(xctxt).str();
- String replace = m_arg2.execute(xctxt).str();
+ String input = m_arg0.strOrNull(xctxt);
+ String pattern = m_arg1.strOrNull(xctxt);
+ String replace = m_arg2.strOrNull(xctxt);
+
+ if (input == null || replace == null || pattern == null)
+ return XSequence.EMPTY;
+
String flags = "";
if (m_args != null)
flags = m_args[0].execute(xctxt).str();
@@ -112,6 +117,8 @@
int[] range;
// Note: Not really sure this is correct.
// Needs review!!! See regex020, E4...
+ // the begining of the following character token will
+ // be the end of this paren token.
if (child.getType() == Token.PAREN &&
(i+1 < tokenTree.size()) &&
tokenTree.getChild(i+1).getType() == Token.CHAR)
1.1.2.3 +9 -3
xml-xalan/java/src/org/apache/xpath/functions/Attic/FuncTokenize.java
Index: FuncTokenize.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/functions/Attic/FuncTokenize.java,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- FuncTokenize.java 19 Aug 2002 22:44:13 -0000 1.1.2.2
+++ FuncTokenize.java 13 Sep 2002 19:59:57 -0000 1.1.2.3
@@ -65,6 +65,7 @@
import org.apache.xpath.objects.XSequenceImpl;
import org.apache.xpath.objects.XString;
import org.apache.xpath.parser.regexp.*;
+import org.apache.xpath.parser.regexp.RegularExpression;
import org.apache.xalan.res.XSLMessages;
/**
@@ -84,8 +85,10 @@
*/
public XObject execute(XPathContext xctxt) throws
javax.xml.transform.TransformerException
{
- String input = m_arg0.execute(xctxt).str();
- String pattern = m_arg1.execute(xctxt).str();
+ String input = m_arg0.strOrNull(xctxt);
+ String pattern = m_arg1.strOrNull(xctxt);
+ if (input == null || pattern == null)
+ return XSequence.EMPTY;
String flags = "";
if (m_arg2 != null)
flags = m_arg2.execute(xctxt).str();
@@ -115,7 +118,10 @@
index = length;
}
}
- return seq;
+ if (seq.getLength() == 0)
+ return XSequence.EMPTY;
+ else
+ return seq;
}
No revision
No revision
1.1.2.1 +88 -0
xml-xalan/java/src/org/apache/xpath/functions/Attic/FuncEmpty.java
1.1.2.1 +88 -0
xml-xalan/java/src/org/apache/xpath/functions/Attic/FuncExists.java
1.1.2.1 +193 -0
xml-xalan/java/src/org/apache/xpath/functions/Attic/FuncIndexOf.java
1.1.2.1 +108 -0
xml-xalan/java/src/org/apache/xpath/functions/Attic/FuncItemAt.java
No revision
No revision
1.1.2.1.2.9 +13 -1
xml-xalan/java/src/org/apache/xpath/parser/Attic/SimpleNode.java
Index: SimpleNode.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/parser/Attic/SimpleNode.java,v
retrieving revision 1.1.2.1.2.8
retrieving revision 1.1.2.1.2.9
diff -u -r1.1.2.1.2.8 -r1.1.2.1.2.9
--- SimpleNode.java 6 Sep 2002 19:53:26 -0000 1.1.2.1.2.8
+++ SimpleNode.java 13 Sep 2002 19:59:58 -0000 1.1.2.1.2.9
@@ -362,7 +362,19 @@
new FuncReplace());
m_builtInFunctions.put(
new QName("tokenize"),
- new FuncTokenize());
+ new FuncTokenize());
+m_builtInFunctions.put(
+ new QName("empty"),
+ new FuncEmpty());
+m_builtInFunctions.put(
+ new QName("exists"),
+ new FuncExists());
+m_builtInFunctions.put(
+ new QName("index-of"),
+ new FuncIndexOf());
+m_builtInFunctions.put(
+ new QName("item-at"),
+ new FuncItemAt());
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]