}
public static boolean noSchemaToRDF(Resource subject, Element elem, Seq seq, Context ctx)
throws Exception {
Model m = subject.getModel();
Statement stmt = null;
String uri = expandQName(elem, ctx.getModel(), ctx);
Property prop = m.createProperty(uri);
// anything with no attributes and a single (or no) value is simple
// anything with attributes is complex
// anything with children is complex
String simple = getSimpleContent(elem);
if (elem.hasAttributes() || simple==null) {
// looks like a complex type
Resource obj = null;
if (elem.hasAttributeNS(XML,"id")) {
String id = elem.getAttributeNS(XML,"id");
obj = m.createResource(addFragment(ctx.getBaseMap(), id).toString());
}
else obj = m.createResource();
// explicit xsi:type
if (elem.hasAttributeNS(schema.XSI,"type")) {
String t = elem.getAttributeNS(schema.XSI,"type");
String fullname = expandQName(ctx.getDefaultNS(),t,elem,ctx.getModel());
complexType c = ctx.getComplexType(fullname);
if (c!=null) {
String id = c.getID(elem,ctx);
Resource o = id==null?m.createResource():m.createResource(addFragment(ctx.getBaseMap(), id).toString());
stmt = m.createStatement(subject,prop,o);
// the new resource, o, becomes the subject
Seq subSeq = null;
if (ctx.isSequenced() && elem.hasChildNodes() && c.needSeq(new HashSet<String>(), ctx))
subSeq = m.getSeq(o.addProperty(RDF.type, RDF.Seq));
int index = c.toRDF(o, elem, 0, subSeq,null,true,ctx);
// mop up remaining values in sequence
produceMixed(subSeq, index, elem);
m.add(stmt);
return true;
}
else Gloze.logger.warn("undefined type: "+fullname);
}
stmt = m.createStatement(subject,prop,obj);
m.add(stmt);
if (seq != null) seq.add(stmt.createReifiedStatement());
// we can't confuse a (single) simple rdf:value with an attribute
Seq s = null;
// Added extra condition - we should be able to turn off sequencing, risking confusion between attributes and object properties
if (simple==null && ctx.isSequenced()) s = m.getSeq(obj.addProperty(RDF.type, RDF.Seq));
// add attributes (and possibly define xmlns)
NamedNodeMap nm = elem.getAttributes();
for (int i=0; i<nm.getLength(); i++)
noSchemaToRDF(obj, (Attr) nm.item(i),ctx);
// add elements
NodeList nl = elem.getChildNodes();
for (int i=0; i<nl.getLength(); i++) {
switch (nl.item(i).getNodeType()) {
case Node.ELEMENT_NODE:
Element e = (Element) nl.item(i);
noSchemaToRDF(obj,e,s,ctx);
break;
case Node.TEXT_NODE:
String value = ((Text) nl.item(i)).getNodeValue().trim();
Literal lit = null;
if (elem.hasAttributeNS(XML,"lang"))
lit = m.createLiteral(value, elem.getAttributeNS(XML,"lang"));
else
lit = ctx.getModel().createLiteral(value);
stmt = ctx.getModel().createStatement(obj,RDF.value,lit);
if (!value.equals("")) {
ctx.getModel().add(stmt);
if (s!=null) s.add(stmt.createReifiedStatement());
}
}
}
return true;
}
else { // looks like a simple type
String value = XMLBean.getValue(elem);
if (value!=null && ctx.isPreserved()) value = value.trim();
if (value==null) value = "";
Literal l = m.createLiteral(value);
stmt = m.createStatement(subject,prop,l);
m.add(stmt);
if (seq != null && stmt!=null) seq.add(stmt.createReifiedStatement());
return true;
}
}