- From: Mark Proctor <mproctor@codehaus.org>
- Date: Mon, 25 Oct 2004 12:18:08 +0200
- To: George Cristian Bina <george@sync.ro>
- CC: xmlschema-dev@w3.org
When processing the following file: <?xml version="1.0"?> <rule-set name="fibonacci" xmlns="http://drools.org/rules" xmlns:java="http://drools.org/semantics/java"> <rule name="Recurse" salience="10"> <parameter identifier="f"> <java:class>org.drools.examples.fibonacci.Fibonacci</java:class> </parameter> <java:condition>f.getValue() == -1</java:condition> <java:consequence> System.err.println( "recurse for " + f.getSequence() ); drools.assertObject( new Fibonacci( f.getSequence() - 1 ) ); </java:consequence> </rule> </rule-set> I get the following error: [java] Using drl: fibonacci.java.drl [java] (null: 10, 83): src-resolve: Cannot resolve the name 'rules:class' to a(n) 'element declaration' component. [java] (null: 23, 46): s4s-elt-invalid-content.1: The content of '#AnonType_ parameterrule' is invalid. Element 'element' is invalid, misplaced, or occurs t oo often. [java] (jar:file:/D:/java/workspaces/drools/drools-examples/target/drools-ex amples-2.0-beta-18.jar!/org/drools/examples/fibonacci/fibonacci.java.drl: 11, 21 ): cvc-complex-type.2.4.a: Invalid content was found starting with element 'java :condition'. One of '{"http://drools.org/rules":parameter, "http://drools.org/ru les":condition}' is expected. Yes I'm using xerces 2.6.2 and I make it aware of the .xsds with the following code: InputStream java = cl.getResourceAsStream( "META-INF/java.xsd" ); InputStream python = cl.getResourceAsStream( "META-INF/python.xsd" ); InputStream groovy = cl.getResourceAsStream( "META-INF/groovy.xsd" ); InputStream rules = cl.getResourceAsStream( "META-INF/rules.xsd" ); java.util.List schemaList = new java.util.ArrayList( ); if ( java != null ) schemaList.add( java ); if ( python != null ) schemaList.add( python ); if ( groovy != null ) schemaList.add( groovy ); if ( rules != null ) schemaList.add( rules ); parser.setProperty( JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA ); parser.setProperty(SCHEMA_SOURCE,( InputStream[] ) schemaList.toArray( new InputStream[0] ) ); For reference these are the exact files I'm using to to the validation: rulex.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://drools.org/rules" elementFormDefault="qualified" xmlns:rules="http://drools.org/rules"> <xs:element name="rule-set"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" ref="rules:rule"/> </xs:sequence> <xs:attribute name="name" use="required" type="xs:string"/> <xs:attribute name="description" type="xs:string"/> </xs:complexType> </xs:element> <xs:element name="rule"> <xs:complexType> <xs:sequence> <xs:element name="parameter" maxOccurs="unbounded" > <xs:complexType> <xs:element ref="rules:class"/> <xs:attribute name="identifier" use="required" type="xs:string"/> </xs:complexType> </xs:element> <xs:element ref="rules:condition" maxOccurs="unbounded"/> <xs:element ref="rules:consequence"/> </xs:sequence> <xs:attribute name="name" use="required" type="xs:string"/> <xs:attribute name="salience" type="xs:integer"/> <xs:attribute name="no-loop" type="xs:boolean"/> <xs:attribute name="description" type="xs:string"/> </xs:complexType> </xs:element> <xs:element name="class" type="xs:string" abstract="true"/> <xs:element name="condition" type="xs:string" abstract="true"/> <xs:element name="consequence" type="xs:string" abstract="true"/> </xs:schema> java.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://drools.org/semantics/java" elementFormDefault="qualified" xmlns:java="http://drools.org/semantics/java" xmlns:rules="http://drools.org/rules"> <xs:import namespace="http://drools.org/rules"/> <xs:element name="class" type="xs:string" substitutionGroup="rules:class"/> <xs:element name="condition" type="xs:string" substitutionGroup="rules:condition"/> <xs:element name="consequence" type="xs:string" substitutionGroup="rules:consequence"/> </xs:schema> Hope thats enough information. Mark George Cristian Bina wrote: > > Hi Mark, > > I tried your files and they work without any problems. I saved the > first schema as rules.xsd, the second as java.xsd and added a > schemaLocation to the import element, then the following sample: > > <?xml version="1.0" encoding="UTF-8"?> > <rule-set xmlns="http://drools.org/rules" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation="http://drools.org/semantics/java java.xsd > http://drools.org/rules rules.xsd" name="test"> > <rule name="r1"> > <parameter identifier="test"> > <class xmlns="http://drools.org/semantics/java"/> > </parameter> > <condition xmlns="http://drools.org/semantics/java"/> > <consequence xmlns="http://drools.org/semantics/java"/> > </rule> > </rule-set> > > is valid according with Xerces 2.6.2 (from your similar post on the > xerces-j-dev list I guess you are using Xerces). > > Hope that helps, > George > --------------------------------------------------------------------- > George Cristian Bina > <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger > http://www.oxygenxml.com > > > Mark Proctor wrote: > >> In the http://drools.org project we have a base name space: >> http://drools.org/rules >> And three semantic namespaces: >> http://drools.org/semantic/java >> http://drools.org/semantic/groovy >> http://drools.org/semantic/python >> >> Each namespace xsd is in its own file. >> >> A rule is made up of classes, conditions, consequences and at the >> moment in the rule.xsd we use the choice feature to allow a user to >> specify which one they want: >> <xs:choice> >> <xs:element ref="java:consequence"/> >> <xs:element ref="groovy:consequence"/> >> <xs:element ref="python:consequence"/> >> </xs:choice> >> However this has the side affect of coupling the rule.xsd to the >> semantic xsds, and as a user only has the semantic xsds in the >> classpath that they wish to use they receive errors about the other >> namespaces, plus it makes it difficult for users wishing to add more >> semantic implementations as they need to alter rules.xsd. >> >> To try and remove this coupling we wanted to use some sort of >> abstract class in rules.xsd to specify a type, which the semantics >> would then extend. It seems the only way to do this is with >> substitutionalGroup, however it refuses to work when the elements are >> in different files and namespaces. >> >> I have included some sample code, any help would be greatly appreciated. >> >> Regards >> >> Mark >> >> ------------------------------- >> <?xml version="1.0" encoding="UTF-8"?> >> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >> targetNamespace="http://drools.org/rules" >> elementFormDefault="qualified" >> xmlns:rules="http://drools.org/rules"> >> >> <xs:element name="rule-set"> >> <xs:complexType> >> <xs:sequence> >> <xs:element minOccurs="0" maxOccurs="unbounded" >> ref="rules:rule"/> >> </xs:sequence> >> <xs:attribute name="name" use="required" type="xs:string"/> >> <xs:attribute name="description" type="xs:string"/> >> </xs:complexType> >> </xs:element> >> >> <xs:element name="rule"> >> <xs:complexType> >> <xs:sequence> >> >> <xs:element name="parameter" maxOccurs="unbounded" > >> <xs:complexType> >> <xs:sequence> >> <xs:element ref="rules:class"/> >> </xs:sequence> >> <xs:attribute name="identifier" use="required" >> type="xs:string"/> >> </xs:complexType> >> </xs:element> >> >> <xs:element ref="rules:condition" maxOccurs="unbounded" /> >> >> <xs:element ref="rules:consequence"/> >> >> </xs:sequence> >> <xs:attribute name="name" use="required" type="xs:string"/> >> <xs:attribute name="salience" type="xs:integer"/> >> <xs:attribute name="no-loop" type="xs:boolean"/> >> <xs:attribute name="description" type="xs:string"/> >> </xs:complexType> >> </xs:element> >> >> <xs:element name="class" type="xs:string" abstract="true"/> >> <xs:element name="condition" type="xs:string" abstract="true"/> >> <xs:element name="consequence" type="xs:string" abstract="true"/> >> >> </xs:schema> >> ------------------------------------------- >> <?xml version="1.0" encoding="UTF-8"?> >> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >> targetNamespace="http://drools.org/semantics/java" >> elementFormDefault="qualified" >> xmlns:java="http://drools.org/semantics/java" >> xmlns:rules="http://drools.org/rules"> >> >> <xs:import namespace="http://drools.org/rules"/> >> >> <xs:element name="class" type="xs:string" >> substitutionGroup="rules:class"/> >> <xs:element name="condition" type="xs:string" >> substitutionGroup="rules:condition"/> >> <xs:element name="consequence" type="xs:string" >> substitutionGroup="rules:consequence"/> >> >> </xs:schema> >> >> >> >> > > >
Received on Monday, 25 October 2004 10:18:45 UTC