There are specific problems with xsd:duration, see
http://www.w3.org/TR/2004/REC-rdf-mt-20040210/#dtype_interp "xsd:duration does not have a well-defined value space" This is fixed and you should use either http://www.w3.org/TR/xmlschema11-2/#yearMonthDuration or http://www.w3.org/TR/xmlschema11-2/#dayTimeDuration I am unclear as to how this interacts with Jena support for duration, or your question - sorry. As regards to your question, the error message that "P" is not a valid duration is correct, "P0D" for example, seems to be valid representation of the zero length duration, which is the canonical one for dayTimeDuration. I can't quite follow where the "P" is produced in your code, but still, wherever it is, patching it to be "P0D" will fix things. Jeremy On Mar 18, 2013, at 1:54 PM, Léonard PETNGA <[email protected]> wrote: > Hi Jena Community, > I'm new to Jena and I would need your help fixing some issues with my code. > I'm trying to parse a String in duration format ie "*PnYn MnDTnH nMn**S*" > into > an *XSDDuration* datatype that I'll bind to a Node of my inferred graph (in > a custom built-in function). To that aim, my parser extracts and stores > integer values for Year, Month, etc... in an array int[9] of *value, *that > is latter passed to the XML duration constructor. This works fine ...except > for when the duration is 0 (see the error below). > > public static int[] parseStringToISODurationInt(String duration) > throwsIllegalArgumentException { > > int[] value = new int[9]; > > StringTokenizer st = new StringTokenizer(duration); > > String nullDur = "PT0H0M0S"; // from a previous converter function > > if (duration == nullDur){ > > value[0] = 0; > > value[1] = 0; > > value[2] = 0; > > value[3] = 0; > > value[4] = 0; > > value[5] = 0; > > value[6] = 0; // [7] is the Z character(zulu timezone, not needed > here), > > value[8] = 3; // 'mscale' value > > } else { > > // ....rest of the code > > } > > return value; > > } > > In my built-in I pass the array obtained to the *XSDDuration(Object > value)*constructor and make the new node that is binded to the graph > as follows : > > Node duration = null; > > duration = Node.createLiteral( > LiteralLabelFactory.create(newXSDDuration(value)) ); > The following excerpt shows the error when running my built-in for a zero > duration (value[i]=0 forall i =0,..6 and value[8]=3 ). > > Exception in thread "main" > com.hp.hpl.jena.datatypes.DatatypeFormatException: Lexical form 'P' is not > a legal instance of Datatype[http://www.w3.org/2001/XMLSchema#duration -> > class com.hp.hpl.jena.datatypes.xsd.XSDDuration] null > [java] at > com.hp.hpl.jena.graph.impl.LiteralLabelImpl.getValue(LiteralLabelImpl.java:300) > > So what what is the legal lexical form for a "zero" duration? How do I > construct that using the *XSDDuration* constructor? > Any other solution will be welcomed... > > Many thanks in advance for your prompt reaction. > > Leo
